Ux500 device tree patches for v3.17:
- Add regulators to STMPE expanders - Add proper DMA channels for all SD/MMC blocks - Add sensors to the device tree -----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQIcBAABAgAGBQJTvmtBAAoJEEEQszewGV1zij0P/15TA2Zk+IGHbzsGfu4KsaZu bCX8mFiwbZUuarn52F5TyUYjfJEXqK6dI1geKOzkH3Q2EUX3ItvHbDcvDBuVwM7s jShrghHsq0T9yJ35Q2npa99jDobX+CqGHFjwPtEBID4SnBoztSh7E6XYHPBeaWmX QA5EI6G/aWzfA8LtQQ38f7u0BVBVpheqhYjzgLJ3IWhHPdnsmE3GfOs7JHwTpD10 O2moP1CcjdxUIjSy9qURc5A9uBUSwR4Q0zt68pqfjF34ViAHMS2vxZ/G7N/Oa0/G hVZsgMDSxeLIEF5L50YaObp0DRFkelE8ldDLi5jFBVyVdK1DRvAKrfDr2TvozJK5 Lmrvs18JErrRYAGLAb4hhp2OanZ2JH9T57glHYpPZla5K0drOEny+CYnvLXfBnTq dD1HHIjT/AdPGSJTKQzX5n77d5LEvNm+5U4KA69hDKuuKR1JGdmTZM8rFAue96I2 TSEZQqMIRxUoNooc9ZNGUA+5QKmZ+gbeb5Xtj30n0xhC61dTeSvw9eXEYUaRYm+p HKoeHRt4BaWqu3Hx0k7eDOT35U4tAutGF0lFurxf7lhQaoCcpuhSDixC5DLLEb3t DTo1MHbxNrzIg9t73P/hztfyz3kGn0m4Ha+93HSpckflAbX1wA6W/6pBDoN+VQOq fTE3SjMV+YAFM6U2R3Yl =wLY8 -----END PGP SIGNATURE----- Merge tag 'ux500-devicetree-v3.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson into next/dt Merge "Ux500 devicetree changes for v3.17" from Linus Walleij: Ux500 device tree patches for v3.17: - Add regulators to STMPE expanders - Add proper DMA channels for all SD/MMC blocks - Add sensors to the device tree * tag 'ux500-devicetree-v3.16-1' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-stericsson: ARM: ux500: add misc sensors to the device trees ARM: ux500: add some DB8500 DMA channel info ARM: ux500: add VCC and VIO regulators to STMPE IC + Linux 3.16-rc4 Signed-off-by: Olof Johansson <olof@lixom.net>
This commit is contained in:
commit
6dda8e594b
|
@ -47,7 +47,6 @@ use constant HIGH_KSWAPD_REWAKEUP => 21;
|
|||
use constant HIGH_NR_SCANNED => 22;
|
||||
use constant HIGH_NR_TAKEN => 23;
|
||||
use constant HIGH_NR_RECLAIMED => 24;
|
||||
use constant HIGH_NR_CONTIG_DIRTY => 25;
|
||||
|
||||
my %perprocesspid;
|
||||
my %perprocess;
|
||||
|
@ -105,7 +104,7 @@ my $regex_direct_end_default = 'nr_reclaimed=([0-9]*)';
|
|||
my $regex_kswapd_wake_default = 'nid=([0-9]*) order=([0-9]*)';
|
||||
my $regex_kswapd_sleep_default = 'nid=([0-9]*)';
|
||||
my $regex_wakeup_kswapd_default = 'nid=([0-9]*) zid=([0-9]*) order=([0-9]*)';
|
||||
my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_taken=([0-9]*) contig_taken=([0-9]*) contig_dirty=([0-9]*) contig_failed=([0-9]*)';
|
||||
my $regex_lru_isolate_default = 'isolate_mode=([0-9]*) order=([0-9]*) nr_requested=([0-9]*) nr_scanned=([0-9]*) nr_taken=([0-9]*) file=([0-9]*)';
|
||||
my $regex_lru_shrink_inactive_default = 'nid=([0-9]*) zid=([0-9]*) nr_scanned=([0-9]*) nr_reclaimed=([0-9]*) priority=([0-9]*) flags=([A-Z_|]*)';
|
||||
my $regex_lru_shrink_active_default = 'lru=([A-Z_]*) nr_scanned=([0-9]*) nr_rotated=([0-9]*) priority=([0-9]*)';
|
||||
my $regex_writepage_default = 'page=([0-9a-f]*) pfn=([0-9]*) flags=([A-Z_|]*)';
|
||||
|
@ -200,7 +199,7 @@ $regex_lru_isolate = generate_traceevent_regex(
|
|||
$regex_lru_isolate_default,
|
||||
"isolate_mode", "order",
|
||||
"nr_requested", "nr_scanned", "nr_taken",
|
||||
"contig_taken", "contig_dirty", "contig_failed");
|
||||
"file");
|
||||
$regex_lru_shrink_inactive = generate_traceevent_regex(
|
||||
"vmscan/mm_vmscan_lru_shrink_inactive",
|
||||
$regex_lru_shrink_inactive_default,
|
||||
|
@ -375,7 +374,6 @@ EVENT_PROCESS:
|
|||
}
|
||||
my $isolate_mode = $1;
|
||||
my $nr_scanned = $4;
|
||||
my $nr_contig_dirty = $7;
|
||||
|
||||
# To closer match vmstat scanning statistics, only count isolate_both
|
||||
# and isolate_inactive as scanning. isolate_active is rotation
|
||||
|
@ -385,7 +383,6 @@ EVENT_PROCESS:
|
|||
if ($isolate_mode != 2) {
|
||||
$perprocesspid{$process_pid}->{HIGH_NR_SCANNED} += $nr_scanned;
|
||||
}
|
||||
$perprocesspid{$process_pid}->{HIGH_NR_CONTIG_DIRTY} += $nr_contig_dirty;
|
||||
} elsif ($tracepoint eq "mm_vmscan_lru_shrink_inactive") {
|
||||
$details = $6;
|
||||
if ($details !~ /$regex_lru_shrink_inactive/o) {
|
||||
|
@ -539,13 +536,6 @@ sub dump_stats {
|
|||
}
|
||||
}
|
||||
}
|
||||
if ($stats{$process_pid}->{HIGH_NR_CONTIG_DIRTY}) {
|
||||
print " ";
|
||||
my $count = $stats{$process_pid}->{HIGH_NR_CONTIG_DIRTY};
|
||||
if ($count != 0) {
|
||||
print "contig-dirty=$count ";
|
||||
}
|
||||
}
|
||||
|
||||
print "\n";
|
||||
}
|
||||
|
|
57
MAINTAINERS
57
MAINTAINERS
|
@ -943,16 +943,10 @@ L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
|||
S: Maintained
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/shawnguo/linux.git
|
||||
F: arch/arm/mach-imx/
|
||||
F: arch/arm/mach-mxs/
|
||||
F: arch/arm/boot/dts/imx*
|
||||
F: arch/arm/configs/imx*_defconfig
|
||||
|
||||
ARM/FREESCALE MXS ARM ARCHITECTURE
|
||||
M: Shawn Guo <shawn.guo@linaro.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
T: git git://git.linaro.org/people/shawnguo/linux-2.6.git
|
||||
F: arch/arm/mach-mxs/
|
||||
|
||||
ARM/GLOMATION GESBC9312SX MACHINE SUPPORT
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
|
@ -1052,9 +1046,33 @@ M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
|||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
S: Maintained
|
||||
F: arch/arm/mach-keystone/
|
||||
F: drivers/clk/keystone/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/ssantosh/linux-keystone.git
|
||||
|
||||
ARM/TEXAS INSTRUMENT KEYSTONE CLOCK FRAMEWORK
|
||||
M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/clk/keystone/
|
||||
|
||||
ARM/TEXAS INSTRUMENT KEYSTONE ClOCKSOURCE
|
||||
M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/clocksource/timer-keystone.c
|
||||
|
||||
ARM/TEXAS INSTRUMENT KEYSTONE RESET DRIVER
|
||||
M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/power/reset/keystone-reset.c
|
||||
|
||||
ARM/TEXAS INSTRUMENT AEMIF/EMIF DRIVERS
|
||||
M: Santosh Shilimkar <santosh.shilimkar@ti.com>
|
||||
L: linux-kernel@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/memory/*emif*
|
||||
|
||||
ARM/LOGICPD PXA270 MACHINE SUPPORT
|
||||
M: Lennert Buytenhek <kernel@wantstofly.org>
|
||||
L: linux-arm-kernel@lists.infradead.org (moderated for non-subscribers)
|
||||
|
@ -5512,10 +5530,11 @@ S: Maintained
|
|||
F: arch/arm/mach-lpc32xx/
|
||||
|
||||
LSILOGIC MPT FUSION DRIVERS (FC/SAS/SPI)
|
||||
M: Nagalakshmi Nandigama <Nagalakshmi.Nandigama@lsi.com>
|
||||
M: Sreekanth Reddy <Sreekanth.Reddy@lsi.com>
|
||||
M: support@lsi.com
|
||||
L: DL-MPTFusionLinux@lsi.com
|
||||
M: Nagalakshmi Nandigama <nagalakshmi.nandigama@avagotech.com>
|
||||
M: Praveen Krishnamoorthy <praveen.krishnamoorthy@avagotech.com>
|
||||
M: Sreekanth Reddy <sreekanth.reddy@avagotech.com>
|
||||
M: Abhijit Mahajan <abhijit.mahajan@avagotech.com>
|
||||
L: MPT-FusionLinux.pdl@avagotech.com
|
||||
L: linux-scsi@vger.kernel.org
|
||||
W: http://www.lsilogic.com/support
|
||||
S: Supported
|
||||
|
@ -9406,12 +9425,6 @@ S: Maintained
|
|||
F: drivers/usb/host/isp116x*
|
||||
F: include/linux/usb/isp116x.h
|
||||
|
||||
USB KAWASAKI LSI DRIVER
|
||||
M: Oliver Neukum <oliver@neukum.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/usb/serial/kl5kusb105.*
|
||||
|
||||
USB MASS STORAGE DRIVER
|
||||
M: Matthew Dharm <mdharm-usb@one-eyed-alien.net>
|
||||
L: linux-usb@vger.kernel.org
|
||||
|
@ -9439,12 +9452,6 @@ S: Maintained
|
|||
F: Documentation/usb/ohci.txt
|
||||
F: drivers/usb/host/ohci*
|
||||
|
||||
USB OPTION-CARD DRIVER
|
||||
M: Matthias Urlichs <smurf@smurf.noris.de>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: drivers/usb/serial/option.c
|
||||
|
||||
USB PEGASUS DRIVER
|
||||
M: Petko Manolov <petkan@nucleusys.com>
|
||||
L: linux-usb@vger.kernel.org
|
||||
|
@ -9477,7 +9484,7 @@ S: Maintained
|
|||
F: drivers/net/usb/rtl8150.c
|
||||
|
||||
USB SERIAL SUBSYSTEM
|
||||
M: Johan Hovold <jhovold@gmail.com>
|
||||
M: Johan Hovold <johan@kernel.org>
|
||||
L: linux-usb@vger.kernel.org
|
||||
S: Maintained
|
||||
F: Documentation/usb/usb-serial.txt
|
||||
|
|
5
Makefile
5
Makefile
|
@ -1,7 +1,7 @@
|
|||
VERSION = 3
|
||||
PATCHLEVEL = 16
|
||||
SUBLEVEL = 0
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Shuffling Zombie Juror
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -126,7 +126,10 @@ PHONY += $(MAKECMDGOALS) sub-make
|
|||
$(filter-out _all sub-make $(CURDIR)/Makefile, $(MAKECMDGOALS)) _all: sub-make
|
||||
@:
|
||||
|
||||
# Fake the "Entering directory" message once, so that IDEs/editors are
|
||||
# able to understand relative filenames.
|
||||
sub-make: FORCE
|
||||
@echo "make[1]: Entering directory \`$(KBUILD_OUTPUT)'"
|
||||
$(if $(KBUILD_VERBOSE:1=),@)$(MAKE) -C $(KBUILD_OUTPUT) \
|
||||
KBUILD_SRC=$(CURDIR) \
|
||||
KBUILD_EXTMOD="$(KBUILD_EXTMOD)" -f $(CURDIR)/Makefile \
|
||||
|
|
|
@ -319,6 +319,10 @@
|
|||
phy-mode = "rmii";
|
||||
};
|
||||
|
||||
&phy_sel {
|
||||
rmii-clock-ext;
|
||||
};
|
||||
|
||||
&i2c0 {
|
||||
status = "okay";
|
||||
pinctrl-names = "default";
|
||||
|
|
|
@ -773,7 +773,6 @@
|
|||
clocks = <&qspi_gfclk_div>;
|
||||
clock-names = "fck";
|
||||
num-cs = <4>;
|
||||
interrupts = <0 343 0x4>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
@ -984,6 +983,17 @@
|
|||
#size-cells = <1>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
atl: atl@4843c000 {
|
||||
compatible = "ti,dra7-atl";
|
||||
reg = <0x4843c000 0x3ff>;
|
||||
ti,hwmods = "atl";
|
||||
ti,provided-clocks = <&atl_clkin0_ck>, <&atl_clkin1_ck>,
|
||||
<&atl_clkin2_ck>, <&atl_clkin3_ck>;
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
clock-names = "fck";
|
||||
status = "disabled";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
@ -10,26 +10,26 @@
|
|||
&cm_core_aon_clocks {
|
||||
atl_clkin0_ck: atl_clkin0_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
atl_clkin1_ck: atl_clkin1_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
atl_clkin2_ck: atl_clkin2_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
atl_clkin3_ck: atl_clkin3_ck {
|
||||
#clock-cells = <0>;
|
||||
compatible = "fixed-clock";
|
||||
clock-frequency = <0>;
|
||||
compatible = "ti,dra7-atl-clock";
|
||||
clocks = <&atl_gfclk_mux>;
|
||||
};
|
||||
|
||||
hdmi_clkin_ck: hdmi_clkin_ck {
|
||||
|
|
|
@ -251,6 +251,11 @@
|
|||
codec {
|
||||
};
|
||||
};
|
||||
|
||||
twl_power: power {
|
||||
compatible = "ti,twl4030-power-beagleboard-xm", "ti,twl4030-power-idle-osc-off";
|
||||
ti,use_poweroff;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -301,6 +306,7 @@
|
|||
};
|
||||
|
||||
&uart3 {
|
||||
interrupts-extended = <&intc 74 &omap3_pmx_core OMAP3_UART3_RX>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&uart3_pins>;
|
||||
};
|
||||
|
|
|
@ -50,6 +50,13 @@
|
|||
gpios = <&twl_gpio 18 GPIO_ACTIVE_LOW>;
|
||||
};
|
||||
|
||||
&twl {
|
||||
twl_power: power {
|
||||
compatible = "ti,twl4030-power-omap3-evm", "ti,twl4030-power-idle";
|
||||
ti,use_poweroff;
|
||||
};
|
||||
};
|
||||
|
||||
&i2c2 {
|
||||
clock-frequency = <400000>;
|
||||
};
|
||||
|
|
|
@ -351,6 +351,11 @@
|
|||
compatible = "ti,twl4030-audio";
|
||||
ti,enable-vibra = <1>;
|
||||
};
|
||||
|
||||
twl_power: power {
|
||||
compatible = "ti,twl4030-power-n900", "ti,twl4030-power-idle-osc-off";
|
||||
ti,use_poweroff;
|
||||
};
|
||||
};
|
||||
|
||||
&twl_keypad {
|
||||
|
|
|
@ -45,7 +45,6 @@
|
|||
|
||||
operating-points = <
|
||||
/* kHz uV */
|
||||
500000 880000
|
||||
1000000 1060000
|
||||
1500000 1250000
|
||||
>;
|
||||
|
|
|
@ -875,6 +875,10 @@
|
|||
reg = <0x80119000 0x1000>;
|
||||
interrupts = <0 59 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
dmas = <&dma 41 0 0x2>, /* Logical - DevToMem */
|
||||
<&dma 41 0 0x0>; /* Logical - MemToDev */
|
||||
dma-names = "rx", "tx";
|
||||
|
||||
clocks = <&prcc_kclk 2 5>, <&prcc_pclk 2 7>;
|
||||
clock-names = "sdi", "apb_pclk";
|
||||
|
||||
|
@ -901,6 +905,10 @@
|
|||
reg = <0x80008000 0x1000>;
|
||||
interrupts = <0 100 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
dmas = <&dma 43 0 0x2>, /* Logical - DevToMem */
|
||||
<&dma 43 0 0x0>; /* Logical - MemToDev */
|
||||
dma-names = "rx", "tx";
|
||||
|
||||
clocks = <&prcc_kclk 3 7>, <&prcc_pclk 3 7>;
|
||||
clock-names = "sdi", "apb_pclk";
|
||||
|
||||
|
@ -929,6 +937,7 @@
|
|||
interrupts = <0 62 IRQ_TYPE_LEVEL_HIGH>;
|
||||
v-ape-supply = <&db8500_vape_reg>;
|
||||
|
||||
/* This DMA channel only exist on DB8500 v1 */
|
||||
dmas = <&dma 30 0 0x10>; /* Logical - MemToDev - HighPrio */
|
||||
dma-names = "tx";
|
||||
|
||||
|
@ -962,6 +971,7 @@
|
|||
interrupts = <0 62 IRQ_TYPE_LEVEL_HIGH>;
|
||||
v-ape-supply = <&db8500_vape_reg>;
|
||||
|
||||
/* This DMA channel only exist on DB8500 v2 */
|
||||
dmas = <&dma 30 0 0x12>; /* Logical - DevToMem - HighPrio */
|
||||
dma-names = "rx";
|
||||
|
||||
|
|
|
@ -42,6 +42,8 @@
|
|||
interrupts = <26 IRQ_TYPE_EDGE_FALLING>;
|
||||
interrupt-parent = <&gpio6>;
|
||||
interrupt-controller;
|
||||
vcc-supply = <&db8500_vsmps2_reg>;
|
||||
vio-supply = <&db8500_vsmps2_reg>;
|
||||
|
||||
wakeup-source;
|
||||
st,autosleep-timeout = <1024>;
|
||||
|
|
|
@ -88,6 +88,43 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
/* Sensors mounted on this board variant */
|
||||
i2c@80128000 {
|
||||
lsm303dlh@18 {
|
||||
/* Accelerometer */
|
||||
compatible = "st,lsm303dlh-accel";
|
||||
st,drdy-int-pin = <1>;
|
||||
reg = <0x18>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&accel_tvk_mode>;
|
||||
};
|
||||
lsm303dlm@1e {
|
||||
/* Magnetometer */
|
||||
compatible = "st,lsm303dlm-magn";
|
||||
reg = <0x1e>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&magneto_tvk_mode>;
|
||||
};
|
||||
l3g4200d@68 {
|
||||
/* Gyroscope */
|
||||
compatible = "st,l3g4200d-gyro";
|
||||
st,drdy-int-pin = <2>;
|
||||
reg = <0x68>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
};
|
||||
lsp001wm@5c {
|
||||
/* Barometer/pressure sensor */
|
||||
compatible = "st,lps001wp-press";
|
||||
reg = <0x5c>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
};
|
||||
};
|
||||
pinctrl {
|
||||
/* Pull up this GPIO pin */
|
||||
tc35893 {
|
||||
|
@ -114,6 +151,28 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
accelerometer {
|
||||
accel_tvk_mode: accel_tvk {
|
||||
/* Accelerometer interrupt lines 1 & 2 */
|
||||
tvk_cfg {
|
||||
ste,pins = "GPIO82_C1", "GPIO83_D3";
|
||||
ste,config = <&gpio_in_pu>;
|
||||
};
|
||||
};
|
||||
};
|
||||
magnetometer {
|
||||
magneto_tvk_mode: magneto_tvk {
|
||||
/* Magnetometer uses GPIO 31 and 32, pull these up/down respectively */
|
||||
tvk_cfg1 {
|
||||
ste,pins = "GPIO31_V3";
|
||||
ste,config = <&gpio_in_pu>;
|
||||
};
|
||||
tvk_cfg2 {
|
||||
ste,pins = "GPIO32_V2";
|
||||
ste,config = <&gpio_in_pd>;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
|
|
@ -35,8 +35,6 @@
|
|||
*/
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ipgpio_hrefv60_mode>,
|
||||
<&accel_hrefv60_mode>,
|
||||
<&magneto_hrefv60_mode>,
|
||||
<&etm_hrefv60_mode>,
|
||||
<&nahj_hrefv60_mode>,
|
||||
<&nfc_hrefv60_mode>,
|
||||
|
@ -83,28 +81,6 @@
|
|||
};
|
||||
};
|
||||
};
|
||||
accelerometer {
|
||||
accel_hrefv60_mode: accel_hrefv60 {
|
||||
/* Accelerometer interrupt lines 1 & 2 */
|
||||
hrefv60_cfg1 {
|
||||
ste,pins = "GPIO82_C1", "GPIO83_D3";
|
||||
ste,config = <&gpio_in_pu>;
|
||||
};
|
||||
};
|
||||
};
|
||||
magnetometer {
|
||||
magneto_hrefv60_mode: magneto_hrefv60 {
|
||||
/* Magnetometer uses GPIO 31 and 32, pull these up/down respectively */
|
||||
hrefv60_cfg1 {
|
||||
ste,pins = "GPIO31_V3";
|
||||
ste,config = <&gpio_in_pu>;
|
||||
};
|
||||
hrefv60_cfg2 {
|
||||
ste,pins = "GPIO32_V2";
|
||||
ste,config = <&gpio_in_pd>;
|
||||
};
|
||||
};
|
||||
};
|
||||
etm {
|
||||
/*
|
||||
* Drive D19-D23 for the ETM PTM trace interface low,
|
||||
|
|
|
@ -241,6 +241,40 @@
|
|||
pinctrl-names = "default","sleep";
|
||||
pinctrl-0 = <&i2c2_default_mode>;
|
||||
pinctrl-1 = <&i2c2_sleep_mode>;
|
||||
lsm303dlh@18 {
|
||||
/* Accelerometer */
|
||||
compatible = "st,lsm303dlh-accel";
|
||||
st,drdy-int-pin = <1>;
|
||||
reg = <0x18>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&accel_snowball_mode>;
|
||||
};
|
||||
lsm303dlm@1e {
|
||||
/* Magnetometer */
|
||||
compatible = "st,lsm303dlm-magn";
|
||||
reg = <0x1e>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&magneto_snowball_mode>;
|
||||
};
|
||||
l3g4200d@68 {
|
||||
/* Gyroscope */
|
||||
compatible = "st,l3g4200d-gyro";
|
||||
st,drdy-int-pin = <2>;
|
||||
reg = <0x68>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
};
|
||||
lsp001wm@5c {
|
||||
/* Barometer/pressure sensor */
|
||||
compatible = "st,lps001wp-press";
|
||||
reg = <0x5c>;
|
||||
vdd-supply = <&ab8500_ldo_aux1_reg>;
|
||||
vddio-supply = <&db8500_vsmps2_reg>;
|
||||
};
|
||||
};
|
||||
|
||||
i2c@80110000 {
|
||||
|
@ -361,9 +395,7 @@
|
|||
* can be moved over to being controlled by respective device.
|
||||
*/
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&accel_snowball_mode>,
|
||||
<&magneto_snowball_mode>,
|
||||
<&gbf_snowball_mode>,
|
||||
pinctrl-0 = <&gbf_snowball_mode>,
|
||||
<&wlan_snowball_mode>;
|
||||
|
||||
ethernet {
|
||||
|
|
|
@ -94,10 +94,10 @@ CONFIG_BACKLIGHT_CLASS_DEVICE=y
|
|||
CONFIG_BACKLIGHT_PWM=y
|
||||
# CONFIG_USB_SUPPORT is not set
|
||||
CONFIG_MMC=y
|
||||
CONFIG_MMC_UNSAFE_RESUME=y
|
||||
CONFIG_MMC_BLOCK_MINORS=32
|
||||
CONFIG_MMC_TEST=y
|
||||
CONFIG_MMC_SDHCI=y
|
||||
CONFIG_MMC_SDHCI_PLTFM=y
|
||||
CONFIG_MMC_SDHCI_BCM_KONA=y
|
||||
CONFIG_NEW_LEDS=y
|
||||
CONFIG_LEDS_CLASS=y
|
||||
|
|
|
@ -223,12 +223,12 @@ CONFIG_POWER_RESET_GPIO=y
|
|||
CONFIG_POWER_RESET_SUN6I=y
|
||||
CONFIG_SENSORS_LM90=y
|
||||
CONFIG_THERMAL=y
|
||||
CONFIG_DOVE_THERMAL=y
|
||||
CONFIG_ARMADA_THERMAL=y
|
||||
CONFIG_WATCHDOG=y
|
||||
CONFIG_ORION_WATCHDOG=y
|
||||
CONFIG_SUNXI_WATCHDOG=y
|
||||
CONFIG_MFD_AS3722=y
|
||||
CONFIG_MFD_BCM590XX=y
|
||||
CONFIG_MFD_CROS_EC=y
|
||||
CONFIG_MFD_CROS_EC_SPI=y
|
||||
CONFIG_MFD_MAX8907=y
|
||||
|
@ -240,6 +240,7 @@ CONFIG_MFD_TPS65910=y
|
|||
CONFIG_REGULATOR_VIRTUAL_CONSUMER=y
|
||||
CONFIG_REGULATOR_AB8500=y
|
||||
CONFIG_REGULATOR_AS3722=y
|
||||
CONFIG_REGULATOR_BCM590XX=y
|
||||
CONFIG_REGULATOR_GPIO=y
|
||||
CONFIG_REGULATOR_MAX8907=y
|
||||
CONFIG_REGULATOR_PALMAS=y
|
||||
|
|
|
@ -7,7 +7,7 @@ CFLAGS_pmsu.o := -march=armv7-a
|
|||
obj-y += system-controller.o mvebu-soc-id.o
|
||||
|
||||
ifeq ($(CONFIG_MACH_MVEBU_V7),y)
|
||||
obj-y += cpu-reset.o board-v7.o coherency.o coherency_ll.o pmsu.o
|
||||
obj-y += cpu-reset.o board-v7.o coherency.o coherency_ll.o pmsu.o pmsu_ll.o
|
||||
obj-$(CONFIG_SMP) += platsmp.o headsmp.o platsmp-a9.o headsmp-a9.o
|
||||
obj-$(CONFIG_HOTPLUG_CPU) += hotplug.o
|
||||
endif
|
||||
|
|
|
@ -23,6 +23,7 @@
|
|||
#include <linux/mbus.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/irqchip.h>
|
||||
#include <asm/hardware/cache-l2x0.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
|
@ -71,17 +72,23 @@ static int armada_375_external_abort_wa(unsigned long addr, unsigned int fsr,
|
|||
return 1;
|
||||
}
|
||||
|
||||
static void __init mvebu_timer_and_clk_init(void)
|
||||
static void __init mvebu_init_irq(void)
|
||||
{
|
||||
of_clk_init(NULL);
|
||||
clocksource_of_init();
|
||||
irqchip_init();
|
||||
mvebu_scu_enable();
|
||||
coherency_init();
|
||||
BUG_ON(mvebu_mbus_dt_init(coherency_available()));
|
||||
}
|
||||
|
||||
if (of_machine_is_compatible("marvell,armada375"))
|
||||
hook_fault_code(16 + 6, armada_375_external_abort_wa, SIGBUS, 0,
|
||||
"imprecise external abort");
|
||||
static void __init external_abort_quirk(void)
|
||||
{
|
||||
u32 dev, rev;
|
||||
|
||||
if (mvebu_get_soc_id(&dev, &rev) == 0 && rev > ARMADA_375_Z1_REV)
|
||||
return;
|
||||
|
||||
hook_fault_code(16 + 6, armada_375_external_abort_wa, SIGBUS, 0,
|
||||
"imprecise external abort");
|
||||
}
|
||||
|
||||
static void __init i2c_quirk(void)
|
||||
|
@ -169,8 +176,10 @@ static void __init mvebu_dt_init(void)
|
|||
{
|
||||
if (of_machine_is_compatible("plathome,openblocks-ax3-4"))
|
||||
i2c_quirk();
|
||||
if (of_machine_is_compatible("marvell,a375-db"))
|
||||
if (of_machine_is_compatible("marvell,a375-db")) {
|
||||
external_abort_quirk();
|
||||
thermal_quirk();
|
||||
}
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
@ -185,7 +194,7 @@ DT_MACHINE_START(ARMADA_370_XP_DT, "Marvell Armada 370/XP (Device Tree)")
|
|||
.l2c_aux_mask = ~0,
|
||||
.smp = smp_ops(armada_xp_smp_ops),
|
||||
.init_machine = mvebu_dt_init,
|
||||
.init_time = mvebu_timer_and_clk_init,
|
||||
.init_irq = mvebu_init_irq,
|
||||
.restart = mvebu_restart,
|
||||
.dt_compat = armada_370_xp_dt_compat,
|
||||
MACHINE_END
|
||||
|
@ -198,7 +207,7 @@ static const char * const armada_375_dt_compat[] = {
|
|||
DT_MACHINE_START(ARMADA_375_DT, "Marvell Armada 375 (Device Tree)")
|
||||
.l2c_aux_val = 0,
|
||||
.l2c_aux_mask = ~0,
|
||||
.init_time = mvebu_timer_and_clk_init,
|
||||
.init_irq = mvebu_init_irq,
|
||||
.init_machine = mvebu_dt_init,
|
||||
.restart = mvebu_restart,
|
||||
.dt_compat = armada_375_dt_compat,
|
||||
|
@ -213,7 +222,7 @@ static const char * const armada_38x_dt_compat[] = {
|
|||
DT_MACHINE_START(ARMADA_38X_DT, "Marvell Armada 380/385 (Device Tree)")
|
||||
.l2c_aux_val = 0,
|
||||
.l2c_aux_mask = ~0,
|
||||
.init_time = mvebu_timer_and_clk_init,
|
||||
.init_irq = mvebu_init_irq,
|
||||
.restart = mvebu_restart,
|
||||
.dt_compat = armada_38x_dt_compat,
|
||||
MACHINE_END
|
||||
|
|
|
@ -66,6 +66,8 @@ static void __iomem *pmsu_mp_base;
|
|||
extern void ll_disable_coherency(void);
|
||||
extern void ll_enable_coherency(void);
|
||||
|
||||
extern void armada_370_xp_cpu_resume(void);
|
||||
|
||||
static struct platform_device armada_xp_cpuidle_device = {
|
||||
.name = "cpuidle-armada-370-xp",
|
||||
};
|
||||
|
@ -140,13 +142,6 @@ static void armada_370_xp_pmsu_enable_l2_powerdown_onidle(void)
|
|||
writel(reg, pmsu_mp_base + L2C_NFABRIC_PM_CTL);
|
||||
}
|
||||
|
||||
static void armada_370_xp_cpu_resume(void)
|
||||
{
|
||||
asm volatile("bl ll_add_cpu_to_smp_group\n\t"
|
||||
"bl ll_enable_coherency\n\t"
|
||||
"b cpu_resume\n\t");
|
||||
}
|
||||
|
||||
/* No locking is needed because we only access per-CPU registers */
|
||||
void armada_370_xp_pmsu_idle_prepare(bool deepidle)
|
||||
{
|
||||
|
|
|
@ -0,0 +1,25 @@
|
|||
/*
|
||||
* Copyright (C) 2014 Marvell
|
||||
*
|
||||
* Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
|
||||
* Gregory Clement <gregory.clement@free-electrons.com>
|
||||
*
|
||||
* This file is licensed under the terms of the GNU General Public
|
||||
* License version 2. This program is licensed "as is" without any
|
||||
* warranty of any kind, whether express or implied.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* This is the entry point through which CPUs exiting cpuidle deep
|
||||
* idle state are going.
|
||||
*/
|
||||
ENTRY(armada_370_xp_cpu_resume)
|
||||
ARM_BE8(setend be ) @ go BE8 if entered LE
|
||||
bl ll_add_cpu_to_smp_group
|
||||
bl ll_enable_coherency
|
||||
b cpu_resume
|
||||
ENDPROC(armada_370_xp_cpu_resume)
|
||||
|
|
@ -110,14 +110,16 @@ obj-y += prm_common.o cm_common.o
|
|||
obj-$(CONFIG_ARCH_OMAP2) += prm2xxx_3xxx.o prm2xxx.o cm2xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += prm2xxx_3xxx.o prm3xxx.o cm3xxx.o
|
||||
obj-$(CONFIG_ARCH_OMAP3) += vc3xxx_data.o vp3xxx_data.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += prm33xx.o cm33xx.o
|
||||
omap-prcm-4-5-common = cminst44xx.o cm44xx.o prm44xx.o \
|
||||
prcm_mpu44xx.o prminst44xx.o \
|
||||
vc44xx_data.o vp44xx_data.o
|
||||
obj-$(CONFIG_ARCH_OMAP4) += $(omap-prcm-4-5-common)
|
||||
obj-$(CONFIG_SOC_OMAP5) += $(omap-prcm-4-5-common)
|
||||
obj-$(CONFIG_SOC_DRA7XX) += $(omap-prcm-4-5-common)
|
||||
obj-$(CONFIG_SOC_AM43XX) += $(omap-prcm-4-5-common)
|
||||
am33xx-43xx-prcm-common += prm33xx.o cm33xx.o
|
||||
obj-$(CONFIG_SOC_AM33XX) += $(am33xx-43xx-prcm-common)
|
||||
obj-$(CONFIG_SOC_AM43XX) += $(omap-prcm-4-5-common) \
|
||||
$(am33xx-43xx-prcm-common)
|
||||
|
||||
# OMAP voltage domains
|
||||
voltagedomain-common := voltage.o vc.o vp.o
|
||||
|
|
|
@ -380,7 +380,7 @@ void am33xx_cm_clkdm_disable_hwsup(u16 inst, u16 cdoffs);
|
|||
void am33xx_cm_clkdm_force_sleep(u16 inst, u16 cdoffs);
|
||||
void am33xx_cm_clkdm_force_wakeup(u16 inst, u16 cdoffs);
|
||||
|
||||
#ifdef CONFIG_SOC_AM33XX
|
||||
#if defined(CONFIG_SOC_AM33XX) || defined(CONFIG_SOC_AM43XX)
|
||||
extern int am33xx_cm_wait_module_idle(u16 inst, s16 cdoffs,
|
||||
u16 clkctrl_offs);
|
||||
extern void am33xx_cm_module_enable(u8 mode, u16 inst, s16 cdoffs,
|
||||
|
|
|
@ -248,7 +248,6 @@ static inline void __iomem *omap4_get_scu_base(void)
|
|||
}
|
||||
#endif
|
||||
|
||||
extern void __init gic_init_irq(void);
|
||||
extern void gic_dist_disable(void);
|
||||
extern void gic_dist_enable(void);
|
||||
extern bool gic_dist_disabled(void);
|
||||
|
|
|
@ -649,6 +649,18 @@ void __init dra7xxx_check_revision(void)
|
|||
}
|
||||
break;
|
||||
|
||||
case 0xb9bc:
|
||||
switch (rev) {
|
||||
case 0:
|
||||
omap_revision = DRA722_REV_ES1_0;
|
||||
break;
|
||||
default:
|
||||
/* If we have no new revisions */
|
||||
omap_revision = DRA722_REV_ES1_0;
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
/* Unknown default to latest silicon rev as default*/
|
||||
pr_warn("%s: unknown idcode=0x%08x (hawkeye=0x%08x,rev=0x%d)\n",
|
||||
|
|
|
@ -183,8 +183,10 @@ static int __init _omap_mux_get_by_name(struct omap_mux_partition *partition,
|
|||
m0_entry = mux->muxnames[0];
|
||||
|
||||
/* First check for full name in mode0.muxmode format */
|
||||
if (mode0_len && strncmp(muxname, m0_entry, mode0_len))
|
||||
continue;
|
||||
if (mode0_len)
|
||||
if (strncmp(muxname, m0_entry, mode0_len) ||
|
||||
(strlen(m0_entry) != mode0_len))
|
||||
continue;
|
||||
|
||||
/* Then check for muxmode only */
|
||||
for (i = 0; i < OMAP_MUX_NR_MODES; i++) {
|
||||
|
|
|
@ -102,26 +102,6 @@ void __init omap_barriers_init(void)
|
|||
{}
|
||||
#endif
|
||||
|
||||
void __init gic_init_irq(void)
|
||||
{
|
||||
void __iomem *omap_irq_base;
|
||||
|
||||
/* Static mapping, never released */
|
||||
gic_dist_base_addr = ioremap(OMAP44XX_GIC_DIST_BASE, SZ_4K);
|
||||
BUG_ON(!gic_dist_base_addr);
|
||||
|
||||
twd_base = ioremap(OMAP44XX_LOCAL_TWD_BASE, SZ_4K);
|
||||
BUG_ON(!twd_base);
|
||||
|
||||
/* Static mapping, never released */
|
||||
omap_irq_base = ioremap(OMAP44XX_GIC_CPU_BASE, SZ_512);
|
||||
BUG_ON(!omap_irq_base);
|
||||
|
||||
omap_wakeupgen_init();
|
||||
|
||||
gic_init(0, 29, gic_dist_base_addr, omap_irq_base);
|
||||
}
|
||||
|
||||
void gic_dist_disable(void)
|
||||
{
|
||||
if (gic_dist_base_addr)
|
||||
|
|
|
@ -4251,9 +4251,9 @@ void __init omap_hwmod_init(void)
|
|||
soc_ops.enable_module = _omap4_enable_module;
|
||||
soc_ops.disable_module = _omap4_disable_module;
|
||||
soc_ops.wait_target_ready = _omap4_wait_target_ready;
|
||||
soc_ops.assert_hardreset = _omap4_assert_hardreset;
|
||||
soc_ops.deassert_hardreset = _omap4_deassert_hardreset;
|
||||
soc_ops.is_hardreset_asserted = _omap4_is_hardreset_asserted;
|
||||
soc_ops.assert_hardreset = _am33xx_assert_hardreset;
|
||||
soc_ops.deassert_hardreset = _am33xx_deassert_hardreset;
|
||||
soc_ops.is_hardreset_asserted = _am33xx_is_hardreset_asserted;
|
||||
soc_ops.init_clkdm = _init_clkdm;
|
||||
} else if (soc_is_am33xx()) {
|
||||
soc_ops.enable_module = _am33xx_enable_module;
|
||||
|
|
|
@ -2020,6 +2020,77 @@ static struct omap_hwmod omap54xx_wd_timer2_hwmod = {
|
|||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* 'ocp2scp' class
|
||||
* bridge to transform ocp interface protocol to scp (serial control port)
|
||||
* protocol
|
||||
*/
|
||||
/* ocp2scp3 */
|
||||
static struct omap_hwmod omap54xx_ocp2scp3_hwmod;
|
||||
/* l4_cfg -> ocp2scp3 */
|
||||
static struct omap_hwmod_ocp_if omap54xx_l4_cfg__ocp2scp3 = {
|
||||
.master = &omap54xx_l4_cfg_hwmod,
|
||||
.slave = &omap54xx_ocp2scp3_hwmod,
|
||||
.clk = "l4_root_clk_div",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
static struct omap_hwmod omap54xx_ocp2scp3_hwmod = {
|
||||
.name = "ocp2scp3",
|
||||
.class = &omap54xx_ocp2scp_hwmod_class,
|
||||
.clkdm_name = "l3init_clkdm",
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = OMAP54XX_CM_L3INIT_OCP2SCP3_CLKCTRL_OFFSET,
|
||||
.context_offs = OMAP54XX_RM_L3INIT_OCP2SCP3_CONTEXT_OFFSET,
|
||||
.modulemode = MODULEMODE_HWCTRL,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/*
|
||||
* 'sata' class
|
||||
* sata: serial ata interface gen2 compliant ( 1 rx/ 1 tx)
|
||||
*/
|
||||
|
||||
static struct omap_hwmod_class_sysconfig omap54xx_sata_sysc = {
|
||||
.sysc_offs = 0x0000,
|
||||
.sysc_flags = (SYSC_HAS_MIDLEMODE | SYSC_HAS_SIDLEMODE),
|
||||
.idlemodes = (SIDLE_FORCE | SIDLE_NO | SIDLE_SMART |
|
||||
SIDLE_SMART_WKUP | MSTANDBY_FORCE | MSTANDBY_NO |
|
||||
MSTANDBY_SMART | MSTANDBY_SMART_WKUP),
|
||||
.sysc_fields = &omap_hwmod_sysc_type2,
|
||||
};
|
||||
|
||||
static struct omap_hwmod_class omap54xx_sata_hwmod_class = {
|
||||
.name = "sata",
|
||||
.sysc = &omap54xx_sata_sysc,
|
||||
};
|
||||
|
||||
/* sata */
|
||||
static struct omap_hwmod omap54xx_sata_hwmod = {
|
||||
.name = "sata",
|
||||
.class = &omap54xx_sata_hwmod_class,
|
||||
.clkdm_name = "l3init_clkdm",
|
||||
.flags = HWMOD_SWSUP_SIDLE | HWMOD_SWSUP_MSTANDBY,
|
||||
.main_clk = "func_48m_fclk",
|
||||
.mpu_rt_idx = 1,
|
||||
.prcm = {
|
||||
.omap4 = {
|
||||
.clkctrl_offs = OMAP54XX_CM_L3INIT_SATA_CLKCTRL_OFFSET,
|
||||
.context_offs = OMAP54XX_RM_L3INIT_SATA_CONTEXT_OFFSET,
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
/* l4_cfg -> sata */
|
||||
static struct omap_hwmod_ocp_if omap54xx_l4_cfg__sata = {
|
||||
.master = &omap54xx_l4_cfg_hwmod,
|
||||
.slave = &omap54xx_sata_hwmod,
|
||||
.clk = "l3_iclk_div",
|
||||
.user = OCP_USER_MPU | OCP_USER_SDMA,
|
||||
};
|
||||
|
||||
/*
|
||||
* Interfaces
|
||||
|
@ -2765,6 +2836,8 @@ static struct omap_hwmod_ocp_if *omap54xx_hwmod_ocp_ifs[] __initdata = {
|
|||
&omap54xx_l4_cfg__usb_tll_hs,
|
||||
&omap54xx_l4_cfg__usb_otg_ss,
|
||||
&omap54xx_l4_wkup__wd_timer2,
|
||||
&omap54xx_l4_cfg__ocp2scp3,
|
||||
&omap54xx_l4_cfg__sata,
|
||||
NULL,
|
||||
};
|
||||
|
||||
|
|
|
@ -462,6 +462,7 @@ IS_OMAP_TYPE(3430, 0x3430)
|
|||
#define DRA7XX_CLASS 0x07000000
|
||||
#define DRA752_REV_ES1_0 (DRA7XX_CLASS | (0x52 << 16) | (0x10 << 8))
|
||||
#define DRA752_REV_ES1_1 (DRA7XX_CLASS | (0x52 << 16) | (0x11 << 8))
|
||||
#define DRA722_REV_ES1_0 (DRA7XX_CLASS | (0x22 << 16) | (0x10 << 8))
|
||||
|
||||
void omap2xxx_check_revision(void);
|
||||
void omap3xxx_check_revision(void);
|
||||
|
|
|
@ -12,8 +12,81 @@
|
|||
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/of_irq.h>
|
||||
#include <linux/of_platform.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/reboot.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/system_misc.h>
|
||||
|
||||
#define SUN4I_WATCHDOG_CTRL_REG 0x00
|
||||
#define SUN4I_WATCHDOG_CTRL_RESTART BIT(0)
|
||||
#define SUN4I_WATCHDOG_MODE_REG 0x04
|
||||
#define SUN4I_WATCHDOG_MODE_ENABLE BIT(0)
|
||||
#define SUN4I_WATCHDOG_MODE_RESET_ENABLE BIT(1)
|
||||
|
||||
#define SUN6I_WATCHDOG1_IRQ_REG 0x00
|
||||
#define SUN6I_WATCHDOG1_CTRL_REG 0x10
|
||||
#define SUN6I_WATCHDOG1_CTRL_RESTART BIT(0)
|
||||
#define SUN6I_WATCHDOG1_CONFIG_REG 0x14
|
||||
#define SUN6I_WATCHDOG1_CONFIG_RESTART BIT(0)
|
||||
#define SUN6I_WATCHDOG1_CONFIG_IRQ BIT(1)
|
||||
#define SUN6I_WATCHDOG1_MODE_REG 0x18
|
||||
#define SUN6I_WATCHDOG1_MODE_ENABLE BIT(0)
|
||||
|
||||
static void __iomem *wdt_base;
|
||||
|
||||
static void sun4i_restart(enum reboot_mode mode, const char *cmd)
|
||||
{
|
||||
if (!wdt_base)
|
||||
return;
|
||||
|
||||
/* Enable timer and set reset bit in the watchdog */
|
||||
writel(SUN4I_WATCHDOG_MODE_ENABLE | SUN4I_WATCHDOG_MODE_RESET_ENABLE,
|
||||
wdt_base + SUN4I_WATCHDOG_MODE_REG);
|
||||
|
||||
/*
|
||||
* Restart the watchdog. The default (and lowest) interval
|
||||
* value for the watchdog is 0.5s.
|
||||
*/
|
||||
writel(SUN4I_WATCHDOG_CTRL_RESTART, wdt_base + SUN4I_WATCHDOG_CTRL_REG);
|
||||
|
||||
while (1) {
|
||||
mdelay(5);
|
||||
writel(SUN4I_WATCHDOG_MODE_ENABLE | SUN4I_WATCHDOG_MODE_RESET_ENABLE,
|
||||
wdt_base + SUN4I_WATCHDOG_MODE_REG);
|
||||
}
|
||||
}
|
||||
|
||||
static struct of_device_id sunxi_restart_ids[] = {
|
||||
{ .compatible = "allwinner,sun4i-a10-wdt" },
|
||||
{ /*sentinel*/ }
|
||||
};
|
||||
|
||||
static void sunxi_setup_restart(void)
|
||||
{
|
||||
struct device_node *np;
|
||||
|
||||
np = of_find_matching_node(NULL, sunxi_restart_ids);
|
||||
if (WARN(!np, "unable to setup watchdog restart"))
|
||||
return;
|
||||
|
||||
wdt_base = of_iomap(np, 0);
|
||||
WARN(!wdt_base, "failed to map watchdog base address");
|
||||
}
|
||||
|
||||
static void __init sunxi_dt_init(void)
|
||||
{
|
||||
sunxi_setup_restart();
|
||||
|
||||
of_platform_populate(NULL, of_default_bus_match_table, NULL, NULL);
|
||||
}
|
||||
|
||||
static const char * const sunxi_board_dt_compat[] = {
|
||||
"allwinner,sun4i-a10",
|
||||
|
@ -23,7 +96,9 @@ static const char * const sunxi_board_dt_compat[] = {
|
|||
};
|
||||
|
||||
DT_MACHINE_START(SUNXI_DT, "Allwinner A1X (Device Tree)")
|
||||
.init_machine = sunxi_dt_init,
|
||||
.dt_compat = sunxi_board_dt_compat,
|
||||
.restart = sun4i_restart,
|
||||
MACHINE_END
|
||||
|
||||
static const char * const sun6i_board_dt_compat[] = {
|
||||
|
@ -51,5 +126,7 @@ static const char * const sun7i_board_dt_compat[] = {
|
|||
};
|
||||
|
||||
DT_MACHINE_START(SUN7I_DT, "Allwinner sun7i (A20) Family")
|
||||
.init_machine = sunxi_dt_init,
|
||||
.dt_compat = sun7i_board_dt_compat,
|
||||
.restart = sun4i_restart,
|
||||
MACHINE_END
|
||||
|
|
|
@ -292,7 +292,7 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
|||
#define pmd_sect(pmd) ((pmd_val(pmd) & PMD_TYPE_MASK) == \
|
||||
PMD_TYPE_SECT)
|
||||
|
||||
#ifdef ARM64_64K_PAGES
|
||||
#ifdef CONFIG_ARM64_64K_PAGES
|
||||
#define pud_sect(pud) (0)
|
||||
#else
|
||||
#define pud_sect(pud) ((pud_val(pud) & PUD_TYPE_MASK) == \
|
||||
|
|
|
@ -21,6 +21,10 @@
|
|||
|
||||
#include <uapi/asm/ptrace.h>
|
||||
|
||||
/* Current Exception Level values, as contained in CurrentEL */
|
||||
#define CurrentEL_EL1 (1 << 2)
|
||||
#define CurrentEL_EL2 (2 << 2)
|
||||
|
||||
/* AArch32-specific ptrace requests */
|
||||
#define COMPAT_PTRACE_GETREGS 12
|
||||
#define COMPAT_PTRACE_SETREGS 13
|
||||
|
|
|
@ -78,8 +78,7 @@ ENTRY(efi_stub_entry)
|
|||
|
||||
/* Turn off Dcache and MMU */
|
||||
mrs x0, CurrentEL
|
||||
cmp x0, #PSR_MODE_EL2t
|
||||
ccmp x0, #PSR_MODE_EL2h, #0x4, ne
|
||||
cmp x0, #CurrentEL_EL2
|
||||
b.ne 1f
|
||||
mrs x0, sctlr_el2
|
||||
bic x0, x0, #1 << 0 // clear SCTLR.M
|
||||
|
|
|
@ -270,8 +270,7 @@ ENDPROC(stext)
|
|||
*/
|
||||
ENTRY(el2_setup)
|
||||
mrs x0, CurrentEL
|
||||
cmp x0, #PSR_MODE_EL2t
|
||||
ccmp x0, #PSR_MODE_EL2h, #0x4, ne
|
||||
cmp x0, #CurrentEL_EL2
|
||||
b.ne 1f
|
||||
mrs x0, sctlr_el2
|
||||
CPU_BE( orr x0, x0, #(1 << 25) ) // Set the EE bit for EL2
|
||||
|
|
|
@ -79,7 +79,8 @@ void __sync_icache_dcache(pte_t pte, unsigned long addr)
|
|||
return;
|
||||
|
||||
if (!test_and_set_bit(PG_dcache_clean, &page->flags)) {
|
||||
__flush_dcache_area(page_address(page), PAGE_SIZE);
|
||||
__flush_dcache_area(page_address(page),
|
||||
PAGE_SIZE << compound_order(page));
|
||||
__flush_icache_all();
|
||||
} else if (icache_is_aivivt()) {
|
||||
__flush_icache_all();
|
||||
|
|
|
@ -384,6 +384,7 @@ void kvm_arch_vcpu_free(struct kvm_vcpu *vcpu)
|
|||
|
||||
kfree(vcpu->arch.guest_ebase);
|
||||
kfree(vcpu->arch.kseg0_commpage);
|
||||
kfree(vcpu);
|
||||
}
|
||||
|
||||
void kvm_arch_vcpu_destroy(struct kvm_vcpu *vcpu)
|
||||
|
|
|
@ -36,6 +36,7 @@ header-y += signal.h
|
|||
header-y += socket.h
|
||||
header-y += sockios.h
|
||||
header-y += sclp_ctl.h
|
||||
header-y += sie.h
|
||||
header-y += stat.h
|
||||
header-y += statfs.h
|
||||
header-y += swab.h
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
#ifndef _UAPI_ASM_S390_SIE_H
|
||||
#define _UAPI_ASM_S390_SIE_H
|
||||
|
||||
#include <asm/sigp.h>
|
||||
|
||||
#define diagnose_codes \
|
||||
{ 0x10, "DIAG (0x10) release pages" }, \
|
||||
{ 0x44, "DIAG (0x44) time slice end" }, \
|
||||
|
@ -13,18 +11,18 @@
|
|||
{ 0x500, "DIAG (0x500) KVM virtio functions" }, \
|
||||
{ 0x501, "DIAG (0x501) KVM breakpoint" }
|
||||
|
||||
#define sigp_order_codes \
|
||||
{ SIGP_SENSE, "SIGP sense" }, \
|
||||
{ SIGP_EXTERNAL_CALL, "SIGP external call" }, \
|
||||
{ SIGP_EMERGENCY_SIGNAL, "SIGP emergency signal" }, \
|
||||
{ SIGP_STOP, "SIGP stop" }, \
|
||||
{ SIGP_STOP_AND_STORE_STATUS, "SIGP stop and store status" }, \
|
||||
{ SIGP_SET_ARCHITECTURE, "SIGP set architecture" }, \
|
||||
{ SIGP_SET_PREFIX, "SIGP set prefix" }, \
|
||||
{ SIGP_SENSE_RUNNING, "SIGP sense running" }, \
|
||||
{ SIGP_RESTART, "SIGP restart" }, \
|
||||
{ SIGP_INITIAL_CPU_RESET, "SIGP initial cpu reset" }, \
|
||||
{ SIGP_STORE_STATUS_AT_ADDRESS, "SIGP store status at address" }
|
||||
#define sigp_order_codes \
|
||||
{ 0x01, "SIGP sense" }, \
|
||||
{ 0x02, "SIGP external call" }, \
|
||||
{ 0x03, "SIGP emergency signal" }, \
|
||||
{ 0x05, "SIGP stop" }, \
|
||||
{ 0x06, "SIGP restart" }, \
|
||||
{ 0x09, "SIGP stop and store status" }, \
|
||||
{ 0x0b, "SIGP initial cpu reset" }, \
|
||||
{ 0x0d, "SIGP set prefix" }, \
|
||||
{ 0x0e, "SIGP store status at address" }, \
|
||||
{ 0x12, "SIGP set architecture" }, \
|
||||
{ 0x15, "SIGP sense running" }
|
||||
|
||||
#define icpt_prog_codes \
|
||||
{ 0x0001, "Prog Operation" }, \
|
||||
|
|
|
@ -95,7 +95,7 @@ static inline gfn_t gfn_to_index(gfn_t gfn, gfn_t base_gfn, int level)
|
|||
#define KVM_REFILL_PAGES 25
|
||||
#define KVM_MAX_CPUID_ENTRIES 80
|
||||
#define KVM_NR_FIXED_MTRR_REGION 88
|
||||
#define KVM_NR_VAR_MTRR 8
|
||||
#define KVM_NR_VAR_MTRR 10
|
||||
|
||||
#define ASYNC_PF_PER_VCPU 64
|
||||
|
||||
|
@ -461,7 +461,7 @@ struct kvm_vcpu_arch {
|
|||
bool nmi_injected; /* Trying to inject an NMI this entry */
|
||||
|
||||
struct mtrr_state_type mtrr_state;
|
||||
u32 pat;
|
||||
u64 pat;
|
||||
|
||||
unsigned switch_db_regs;
|
||||
unsigned long db[KVM_NR_DB_REGS];
|
||||
|
|
|
@ -231,6 +231,22 @@ static inline unsigned long regs_get_kernel_stack_nth(struct pt_regs *regs,
|
|||
|
||||
#define ARCH_HAS_USER_SINGLE_STEP_INFO
|
||||
|
||||
/*
|
||||
* When hitting ptrace_stop(), we cannot return using SYSRET because
|
||||
* that does not restore the full CPU state, only a minimal set. The
|
||||
* ptracer can change arbitrary register values, which is usually okay
|
||||
* because the usual ptrace stops run off the signal delivery path which
|
||||
* forces IRET; however, ptrace_event() stops happen in arbitrary places
|
||||
* in the kernel and don't force IRET path.
|
||||
*
|
||||
* So force IRET path after a ptrace stop.
|
||||
*/
|
||||
#define arch_ptrace_stop_needed(code, info) \
|
||||
({ \
|
||||
set_thread_flag(TIF_NOTIFY_RESUME); \
|
||||
false; \
|
||||
})
|
||||
|
||||
struct user_desc;
|
||||
extern int do_get_thread_area(struct task_struct *p, int idx,
|
||||
struct user_desc __user *info);
|
||||
|
|
|
@ -1462,6 +1462,7 @@ static void svm_get_segment(struct kvm_vcpu *vcpu,
|
|||
*/
|
||||
if (var->unusable)
|
||||
var->db = 0;
|
||||
var->dpl = to_svm(vcpu)->vmcb->save.cpl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1898,7 +1898,7 @@ static int set_msr_hyperv_pw(struct kvm_vcpu *vcpu, u32 msr, u64 data)
|
|||
if (!(data & HV_X64_MSR_TSC_REFERENCE_ENABLE))
|
||||
break;
|
||||
gfn = data >> HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT;
|
||||
if (kvm_write_guest(kvm, data,
|
||||
if (kvm_write_guest(kvm, gfn << HV_X64_MSR_TSC_REFERENCE_ADDRESS_SHIFT,
|
||||
&tsc_ref, sizeof(tsc_ref)))
|
||||
return 1;
|
||||
mark_page_dirty(kvm, gfn);
|
||||
|
|
|
@ -622,8 +622,10 @@ static void zram_reset_device(struct zram *zram, bool reset_capacity)
|
|||
memset(&zram->stats, 0, sizeof(zram->stats));
|
||||
|
||||
zram->disksize = 0;
|
||||
if (reset_capacity)
|
||||
if (reset_capacity) {
|
||||
set_capacity(zram->disk, 0);
|
||||
revalidate_disk(zram->disk);
|
||||
}
|
||||
up_write(&zram->init_lock);
|
||||
}
|
||||
|
||||
|
@ -664,6 +666,7 @@ static ssize_t disksize_store(struct device *dev,
|
|||
zram->comp = comp;
|
||||
zram->disksize = disksize;
|
||||
set_capacity(zram->disk, zram->disksize >> SECTOR_SHIFT);
|
||||
revalidate_disk(zram->disk);
|
||||
up_write(&zram->init_lock);
|
||||
return len;
|
||||
|
||||
|
|
|
@ -810,6 +810,12 @@ static int
|
|||
tda998x_encoder_mode_valid(struct drm_encoder *encoder,
|
||||
struct drm_display_mode *mode)
|
||||
{
|
||||
if (mode->clock > 150000)
|
||||
return MODE_CLOCK_HIGH;
|
||||
if (mode->htotal >= BIT(13))
|
||||
return MODE_BAD_HVALUE;
|
||||
if (mode->vtotal >= BIT(11))
|
||||
return MODE_BAD_VVALUE;
|
||||
return MODE_OK;
|
||||
}
|
||||
|
||||
|
@ -1048,8 +1054,8 @@ read_edid_block(struct drm_encoder *encoder, uint8_t *buf, int blk)
|
|||
return i;
|
||||
}
|
||||
} else {
|
||||
for (i = 10; i > 0; i--) {
|
||||
msleep(10);
|
||||
for (i = 100; i > 0; i--) {
|
||||
msleep(1);
|
||||
ret = reg_read(priv, REG_INT_FLAGS_2);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
@ -1183,7 +1189,6 @@ static void
|
|||
tda998x_encoder_destroy(struct drm_encoder *encoder)
|
||||
{
|
||||
struct tda998x_priv *priv = to_tda998x_priv(encoder);
|
||||
drm_i2c_encoder_destroy(encoder);
|
||||
|
||||
/* disable all IRQs and free the IRQ handler */
|
||||
cec_write(priv, REG_CEC_RXSHPDINTENA, 0);
|
||||
|
@ -1193,6 +1198,7 @@ tda998x_encoder_destroy(struct drm_encoder *encoder)
|
|||
|
||||
if (priv->cec)
|
||||
i2c_unregister_device(priv->cec);
|
||||
drm_i2c_encoder_destroy(encoder);
|
||||
kfree(priv);
|
||||
}
|
||||
|
||||
|
|
|
@ -2087,6 +2087,7 @@ void intel_flush_primary_plane(struct drm_i915_private *dev_priv,
|
|||
static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,
|
||||
enum plane plane, enum pipe pipe)
|
||||
{
|
||||
struct drm_device *dev = dev_priv->dev;
|
||||
struct intel_crtc *intel_crtc =
|
||||
to_intel_crtc(dev_priv->pipe_to_crtc_mapping[pipe]);
|
||||
int reg;
|
||||
|
@ -2106,6 +2107,14 @@ static void intel_enable_primary_hw_plane(struct drm_i915_private *dev_priv,
|
|||
|
||||
I915_WRITE(reg, val | DISPLAY_PLANE_ENABLE);
|
||||
intel_flush_primary_plane(dev_priv, plane);
|
||||
|
||||
/*
|
||||
* BDW signals flip done immediately if the plane
|
||||
* is disabled, even if the plane enable is already
|
||||
* armed to occur at the next vblank :(
|
||||
*/
|
||||
if (IS_BROADWELL(dev))
|
||||
intel_wait_for_vblank(dev, intel_crtc->pipe);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -11088,6 +11097,22 @@ const char *intel_output_name(int output)
|
|||
return names[output];
|
||||
}
|
||||
|
||||
static bool intel_crt_present(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
||||
if (IS_ULT(dev))
|
||||
return false;
|
||||
|
||||
if (IS_CHERRYVIEW(dev))
|
||||
return false;
|
||||
|
||||
if (IS_VALLEYVIEW(dev) && !dev_priv->vbt.int_crt_support)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static void intel_setup_outputs(struct drm_device *dev)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dev->dev_private;
|
||||
|
@ -11096,7 +11121,7 @@ static void intel_setup_outputs(struct drm_device *dev)
|
|||
|
||||
intel_lvds_init(dev);
|
||||
|
||||
if (!IS_ULT(dev) && !IS_CHERRYVIEW(dev) && dev_priv->vbt.int_crt_support)
|
||||
if (intel_crt_present(dev))
|
||||
intel_crt_init(dev);
|
||||
|
||||
if (HAS_DDI(dev)) {
|
||||
|
|
|
@ -3209,6 +3209,14 @@ void gen6_set_rps(struct drm_device *dev, u8 val)
|
|||
*/
|
||||
static void vlv_set_rps_idle(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct drm_device *dev = dev_priv->dev;
|
||||
|
||||
/* Latest VLV doesn't need to force the gfx clock */
|
||||
if (dev->pdev->revision >= 0xd) {
|
||||
valleyview_set_rps(dev_priv->dev, dev_priv->rps.min_freq_softlimit);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* When we are idle. Drop to min voltage state.
|
||||
*/
|
||||
|
@ -6038,6 +6046,27 @@ int i915_release_power_well(void)
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(i915_release_power_well);
|
||||
|
||||
/*
|
||||
* Private interface for the audio driver to get CDCLK in kHz.
|
||||
*
|
||||
* Caller must request power well using i915_request_power_well() prior to
|
||||
* making the call.
|
||||
*/
|
||||
int i915_get_cdclk_freq(void)
|
||||
{
|
||||
struct drm_i915_private *dev_priv;
|
||||
|
||||
if (!hsw_pwr)
|
||||
return -ENODEV;
|
||||
|
||||
dev_priv = container_of(hsw_pwr, struct drm_i915_private,
|
||||
power_domains);
|
||||
|
||||
return intel_ddi_get_cdclk_freq(dev_priv);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i915_get_cdclk_freq);
|
||||
|
||||
|
||||
#define POWER_DOMAIN_MASK (BIT(POWER_DOMAIN_NUM) - 1)
|
||||
|
||||
#define HSW_ALWAYS_ON_POWER_DOMAINS ( \
|
||||
|
|
|
@ -690,6 +690,14 @@ intel_post_enable_primary(struct drm_crtc *crtc)
|
|||
struct drm_device *dev = crtc->dev;
|
||||
struct intel_crtc *intel_crtc = to_intel_crtc(crtc);
|
||||
|
||||
/*
|
||||
* BDW signals flip done immediately if the plane
|
||||
* is disabled, even if the plane enable is already
|
||||
* armed to occur at the next vblank :(
|
||||
*/
|
||||
if (IS_BROADWELL(dev))
|
||||
intel_wait_for_vblank(dev, intel_crtc->pipe);
|
||||
|
||||
/*
|
||||
* FIXME IPS should be fine as long as one plane is
|
||||
* enabled, but in practice it seems to have problems
|
||||
|
|
|
@ -403,16 +403,18 @@ bool radeon_dp_getdpcd(struct radeon_connector *radeon_connector)
|
|||
{
|
||||
struct radeon_connector_atom_dig *dig_connector = radeon_connector->con_priv;
|
||||
u8 msg[DP_DPCD_SIZE];
|
||||
int ret, i;
|
||||
int ret;
|
||||
|
||||
char dpcd_hex_dump[DP_DPCD_SIZE * 3];
|
||||
|
||||
ret = drm_dp_dpcd_read(&radeon_connector->ddc_bus->aux, DP_DPCD_REV, msg,
|
||||
DP_DPCD_SIZE);
|
||||
if (ret > 0) {
|
||||
memcpy(dig_connector->dpcd, msg, DP_DPCD_SIZE);
|
||||
DRM_DEBUG_KMS("DPCD: ");
|
||||
for (i = 0; i < DP_DPCD_SIZE; i++)
|
||||
DRM_DEBUG_KMS("%02x ", msg[i]);
|
||||
DRM_DEBUG_KMS("\n");
|
||||
|
||||
hex_dump_to_buffer(dig_connector->dpcd, sizeof(dig_connector->dpcd),
|
||||
32, 1, dpcd_hex_dump, sizeof(dpcd_hex_dump), false);
|
||||
DRM_DEBUG_KMS("DPCD: %s\n", dpcd_hex_dump);
|
||||
|
||||
radeon_dp_probe_oui(radeon_connector);
|
||||
|
||||
|
|
|
@ -1752,12 +1752,12 @@
|
|||
#define EOP_TC_WB_ACTION_EN (1 << 15) /* L2 */
|
||||
#define EOP_TCL1_ACTION_EN (1 << 16)
|
||||
#define EOP_TC_ACTION_EN (1 << 17) /* L2 */
|
||||
#define EOP_TCL2_VOLATILE (1 << 24)
|
||||
#define EOP_CACHE_POLICY(x) ((x) << 25)
|
||||
/* 0 - LRU
|
||||
* 1 - Stream
|
||||
* 2 - Bypass
|
||||
*/
|
||||
#define EOP_TCL2_VOLATILE (1 << 27)
|
||||
#define DATA_SEL(x) ((x) << 29)
|
||||
/* 0 - discard
|
||||
* 1 - send low 32bit data
|
||||
|
|
|
@ -1551,7 +1551,7 @@ int cypress_populate_smc_voltage_tables(struct radeon_device *rdev,
|
|||
|
||||
table->voltageMaskTable.highMask[RV770_SMC_VOLTAGEMASK_VDDCI] = 0;
|
||||
table->voltageMaskTable.lowMask[RV770_SMC_VOLTAGEMASK_VDDCI] =
|
||||
cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
|
||||
cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
|
|
@ -2726,7 +2726,7 @@ int kv_dpm_init(struct radeon_device *rdev)
|
|||
pi->caps_sclk_ds = true;
|
||||
pi->enable_auto_thermal_throttling = true;
|
||||
pi->disable_nb_ps3_in_battery = false;
|
||||
pi->bapm_enable = false;
|
||||
pi->bapm_enable = true;
|
||||
pi->voltage_drop_t = 0;
|
||||
pi->caps_sclk_throttle_low_notification = false;
|
||||
pi->caps_fps = false; /* true? */
|
||||
|
|
|
@ -1315,7 +1315,7 @@ static void ni_populate_smc_voltage_tables(struct radeon_device *rdev,
|
|||
|
||||
table->voltageMaskTable.highMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] = 0;
|
||||
table->voltageMaskTable.lowMask[NISLANDS_SMC_VOLTAGEMASK_VDDCI] =
|
||||
cpu_to_be32(eg_pi->vddc_voltage_table.mask_low);
|
||||
cpu_to_be32(eg_pi->vddci_voltage_table.mask_low);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -102,6 +102,7 @@ extern int radeon_runtime_pm;
|
|||
extern int radeon_hard_reset;
|
||||
extern int radeon_vm_size;
|
||||
extern int radeon_vm_block_size;
|
||||
extern int radeon_deep_color;
|
||||
|
||||
/*
|
||||
* Copy from radeon_drv.h so we don't have to include both and have conflicting
|
||||
|
@ -749,10 +750,6 @@ union radeon_irq_stat_regs {
|
|||
struct cik_irq_stat_regs cik;
|
||||
};
|
||||
|
||||
#define RADEON_MAX_HPD_PINS 7
|
||||
#define RADEON_MAX_CRTCS 6
|
||||
#define RADEON_MAX_AFMT_BLOCKS 7
|
||||
|
||||
struct radeon_irq {
|
||||
bool installed;
|
||||
spinlock_t lock;
|
||||
|
|
|
@ -1227,11 +1227,19 @@ bool radeon_atom_get_clock_info(struct drm_device *dev)
|
|||
rdev->clock.default_dispclk =
|
||||
le32_to_cpu(firmware_info->info_21.ulDefaultDispEngineClkFreq);
|
||||
if (rdev->clock.default_dispclk == 0) {
|
||||
if (ASIC_IS_DCE5(rdev))
|
||||
if (ASIC_IS_DCE6(rdev))
|
||||
rdev->clock.default_dispclk = 60000; /* 600 Mhz */
|
||||
else if (ASIC_IS_DCE5(rdev))
|
||||
rdev->clock.default_dispclk = 54000; /* 540 Mhz */
|
||||
else
|
||||
rdev->clock.default_dispclk = 60000; /* 600 Mhz */
|
||||
}
|
||||
/* set a reasonable default for DP */
|
||||
if (ASIC_IS_DCE6(rdev) && (rdev->clock.default_dispclk < 53900)) {
|
||||
DRM_INFO("Changing default dispclk from %dMhz to 600Mhz\n",
|
||||
rdev->clock.default_dispclk / 100);
|
||||
rdev->clock.default_dispclk = 60000;
|
||||
}
|
||||
rdev->clock.dp_extclk =
|
||||
le16_to_cpu(firmware_info->info_21.usUniphyDPModeExtClkFreq);
|
||||
rdev->clock.current_dispclk = rdev->clock.default_dispclk;
|
||||
|
|
|
@ -199,6 +199,9 @@ int radeon_get_monitor_bpc(struct drm_connector *connector)
|
|||
}
|
||||
}
|
||||
|
||||
if ((radeon_deep_color == 0) && (bpc > 8))
|
||||
bpc = 8;
|
||||
|
||||
DRM_DEBUG("%s: Display bpc=%d, returned bpc=%d\n",
|
||||
connector->name, connector->display_info.bpc, bpc);
|
||||
|
||||
|
|
|
@ -285,7 +285,6 @@ static void radeon_unpin_work_func(struct work_struct *__work)
|
|||
void radeon_crtc_handle_vblank(struct radeon_device *rdev, int crtc_id)
|
||||
{
|
||||
struct radeon_crtc *radeon_crtc = rdev->mode_info.crtcs[crtc_id];
|
||||
struct radeon_flip_work *work;
|
||||
unsigned long flags;
|
||||
u32 update_pending;
|
||||
int vpos, hpos;
|
||||
|
@ -295,8 +294,11 @@ void radeon_crtc_handle_vblank(struct radeon_device *rdev, int crtc_id)
|
|||
return;
|
||||
|
||||
spin_lock_irqsave(&rdev->ddev->event_lock, flags);
|
||||
work = radeon_crtc->flip_work;
|
||||
if (work == NULL) {
|
||||
if (radeon_crtc->flip_status != RADEON_FLIP_SUBMITTED) {
|
||||
DRM_DEBUG_DRIVER("radeon_crtc->flip_status = %d != "
|
||||
"RADEON_FLIP_SUBMITTED(%d)\n",
|
||||
radeon_crtc->flip_status,
|
||||
RADEON_FLIP_SUBMITTED);
|
||||
spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
@ -344,12 +346,17 @@ void radeon_crtc_handle_flip(struct radeon_device *rdev, int crtc_id)
|
|||
|
||||
spin_lock_irqsave(&rdev->ddev->event_lock, flags);
|
||||
work = radeon_crtc->flip_work;
|
||||
if (work == NULL) {
|
||||
if (radeon_crtc->flip_status != RADEON_FLIP_SUBMITTED) {
|
||||
DRM_DEBUG_DRIVER("radeon_crtc->flip_status = %d != "
|
||||
"RADEON_FLIP_SUBMITTED(%d)\n",
|
||||
radeon_crtc->flip_status,
|
||||
RADEON_FLIP_SUBMITTED);
|
||||
spin_unlock_irqrestore(&rdev->ddev->event_lock, flags);
|
||||
return;
|
||||
}
|
||||
|
||||
/* Pageflip completed. Clean up. */
|
||||
radeon_crtc->flip_status = RADEON_FLIP_NONE;
|
||||
radeon_crtc->flip_work = NULL;
|
||||
|
||||
/* wakeup userspace */
|
||||
|
@ -476,6 +483,7 @@ static void radeon_flip_work_func(struct work_struct *__work)
|
|||
/* do the flip (mmio) */
|
||||
radeon_page_flip(rdev, radeon_crtc->crtc_id, base);
|
||||
|
||||
radeon_crtc->flip_status = RADEON_FLIP_SUBMITTED;
|
||||
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
||||
up_read(&rdev->exclusive_lock);
|
||||
|
||||
|
@ -544,7 +552,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
|
|||
/* We borrow the event spin lock for protecting flip_work */
|
||||
spin_lock_irqsave(&crtc->dev->event_lock, flags);
|
||||
|
||||
if (radeon_crtc->flip_work) {
|
||||
if (radeon_crtc->flip_status != RADEON_FLIP_NONE) {
|
||||
DRM_DEBUG_DRIVER("flip queue: crtc already busy\n");
|
||||
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
||||
drm_gem_object_unreference_unlocked(&work->old_rbo->gem_base);
|
||||
|
@ -552,6 +560,7 @@ static int radeon_crtc_page_flip(struct drm_crtc *crtc,
|
|||
kfree(work);
|
||||
return -EBUSY;
|
||||
}
|
||||
radeon_crtc->flip_status = RADEON_FLIP_PENDING;
|
||||
radeon_crtc->flip_work = work;
|
||||
|
||||
/* update crtc fb */
|
||||
|
|
|
@ -175,6 +175,7 @@ int radeon_runtime_pm = -1;
|
|||
int radeon_hard_reset = 0;
|
||||
int radeon_vm_size = 4096;
|
||||
int radeon_vm_block_size = 9;
|
||||
int radeon_deep_color = 0;
|
||||
|
||||
MODULE_PARM_DESC(no_wb, "Disable AGP writeback for scratch registers");
|
||||
module_param_named(no_wb, radeon_no_wb, int, 0444);
|
||||
|
@ -248,6 +249,9 @@ module_param_named(vm_size, radeon_vm_size, int, 0444);
|
|||
MODULE_PARM_DESC(vm_block_size, "VM page table size in bits (default 9)");
|
||||
module_param_named(vm_block_size, radeon_vm_block_size, int, 0444);
|
||||
|
||||
MODULE_PARM_DESC(deep_color, "Deep Color support (1 = enable, 0 = disable (default))");
|
||||
module_param_named(deep_color, radeon_deep_color, int, 0444);
|
||||
|
||||
static struct pci_device_id pciidlist[] = {
|
||||
radeon_PCI_IDS
|
||||
};
|
||||
|
|
|
@ -46,6 +46,10 @@ struct radeon_device;
|
|||
#define to_radeon_encoder(x) container_of(x, struct radeon_encoder, base)
|
||||
#define to_radeon_framebuffer(x) container_of(x, struct radeon_framebuffer, base)
|
||||
|
||||
#define RADEON_MAX_HPD_PINS 7
|
||||
#define RADEON_MAX_CRTCS 6
|
||||
#define RADEON_MAX_AFMT_BLOCKS 7
|
||||
|
||||
enum radeon_rmx_type {
|
||||
RMX_OFF,
|
||||
RMX_FULL,
|
||||
|
@ -233,8 +237,8 @@ struct radeon_mode_info {
|
|||
struct card_info *atom_card_info;
|
||||
enum radeon_connector_table connector_table;
|
||||
bool mode_config_initialized;
|
||||
struct radeon_crtc *crtcs[6];
|
||||
struct radeon_afmt *afmt[7];
|
||||
struct radeon_crtc *crtcs[RADEON_MAX_CRTCS];
|
||||
struct radeon_afmt *afmt[RADEON_MAX_AFMT_BLOCKS];
|
||||
/* DVI-I properties */
|
||||
struct drm_property *coherent_mode_property;
|
||||
/* DAC enable load detect */
|
||||
|
@ -302,6 +306,12 @@ struct radeon_atom_ss {
|
|||
uint16_t amount;
|
||||
};
|
||||
|
||||
enum radeon_flip_status {
|
||||
RADEON_FLIP_NONE,
|
||||
RADEON_FLIP_PENDING,
|
||||
RADEON_FLIP_SUBMITTED
|
||||
};
|
||||
|
||||
struct radeon_crtc {
|
||||
struct drm_crtc base;
|
||||
int crtc_id;
|
||||
|
@ -327,6 +337,7 @@ struct radeon_crtc {
|
|||
/* page flipping */
|
||||
struct workqueue_struct *flip_queue;
|
||||
struct radeon_flip_work *flip_work;
|
||||
enum radeon_flip_status flip_status;
|
||||
/* pll sharing */
|
||||
struct radeon_atom_ss ss;
|
||||
bool ss_enabled;
|
||||
|
|
|
@ -73,8 +73,10 @@ void radeon_pm_acpi_event_handler(struct radeon_device *rdev)
|
|||
rdev->pm.dpm.ac_power = true;
|
||||
else
|
||||
rdev->pm.dpm.ac_power = false;
|
||||
if (rdev->asic->dpm.enable_bapm)
|
||||
radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power);
|
||||
if (rdev->family == CHIP_ARUBA) {
|
||||
if (rdev->asic->dpm.enable_bapm)
|
||||
radeon_dpm_enable_bapm(rdev, rdev->pm.dpm.ac_power);
|
||||
}
|
||||
mutex_unlock(&rdev->pm.mutex);
|
||||
} else if (rdev->pm.pm_method == PM_METHOD_PROFILE) {
|
||||
if (rdev->pm.profile == PM_PROFILE_AUTO) {
|
||||
|
|
|
@ -495,7 +495,7 @@ int radeon_vm_bo_set_addr(struct radeon_device *rdev,
|
|||
mutex_unlock(&vm->mutex);
|
||||
|
||||
r = radeon_bo_create(rdev, RADEON_VM_PTE_COUNT * 8,
|
||||
RADEON_GPU_PAGE_SIZE, false,
|
||||
RADEON_GPU_PAGE_SIZE, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, NULL, &pt);
|
||||
if (r)
|
||||
return r;
|
||||
|
@ -992,7 +992,7 @@ int radeon_vm_init(struct radeon_device *rdev, struct radeon_vm *vm)
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
r = radeon_bo_create(rdev, pd_size, align, false,
|
||||
r = radeon_bo_create(rdev, pd_size, align, true,
|
||||
RADEON_GEM_DOMAIN_VRAM, NULL,
|
||||
&vm->page_directory);
|
||||
if (r)
|
||||
|
|
|
@ -1874,7 +1874,15 @@ int trinity_dpm_init(struct radeon_device *rdev)
|
|||
for (i = 0; i < SUMO_MAX_HARDWARE_POWERLEVELS; i++)
|
||||
pi->at[i] = TRINITY_AT_DFLT;
|
||||
|
||||
pi->enable_bapm = false;
|
||||
/* There are stability issues reported on latops with
|
||||
* bapm installed when switching between AC and battery
|
||||
* power. At the same time, some desktop boards hang
|
||||
* if it's not enabled and dpm is enabled.
|
||||
*/
|
||||
if (rdev->flags & RADEON_IS_MOBILITY)
|
||||
pi->enable_bapm = false;
|
||||
else
|
||||
pi->enable_bapm = true;
|
||||
pi->enable_nbps_policy = true;
|
||||
pi->enable_sclk_ds = true;
|
||||
pi->enable_gfx_power_gating = true;
|
||||
|
|
|
@ -179,7 +179,6 @@ static int vmw_fb_set_par(struct fb_info *info)
|
|||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_POSITION_Y, info->var.yoffset);
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_WIDTH, info->var.xres);
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_HEIGHT, info->var.yres);
|
||||
vmw_write(vmw_priv, SVGA_REG_BYTES_PER_LINE, info->fix.line_length);
|
||||
vmw_write(vmw_priv, SVGA_REG_DISPLAY_ID, SVGA_ID_INVALID);
|
||||
}
|
||||
|
||||
|
|
|
@ -427,9 +427,12 @@ static int ad799x_write_event_value(struct iio_dev *indio_dev,
|
|||
int ret;
|
||||
struct ad799x_state *st = iio_priv(indio_dev);
|
||||
|
||||
if (val < 0 || val > RES_MASK(chan->scan_type.realbits))
|
||||
return -EINVAL;
|
||||
|
||||
mutex_lock(&indio_dev->mlock);
|
||||
ret = ad799x_i2c_write16(st, ad799x_threshold_reg(chan, dir, info),
|
||||
val);
|
||||
val << chan->scan_type.shift);
|
||||
mutex_unlock(&indio_dev->mlock);
|
||||
|
||||
return ret;
|
||||
|
@ -452,7 +455,8 @@ static int ad799x_read_event_value(struct iio_dev *indio_dev,
|
|||
mutex_unlock(&indio_dev->mlock);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
*val = valin;
|
||||
*val = (valin >> chan->scan_type.shift) &
|
||||
RES_MASK(chan->scan_type.realbits);
|
||||
|
||||
return IIO_VAL_INT;
|
||||
}
|
||||
|
|
|
@ -183,7 +183,7 @@ static struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
|
|||
else if (name && index >= 0) {
|
||||
pr_err("ERROR: could not get IIO channel %s:%s(%i)\n",
|
||||
np->full_name, name ? name : "", index);
|
||||
return chan;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -193,8 +193,9 @@ static struct iio_channel *of_iio_channel_get_by_name(struct device_node *np,
|
|||
*/
|
||||
np = np->parent;
|
||||
if (np && !of_get_property(np, "io-channel-ranges", NULL))
|
||||
break;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return chan;
|
||||
}
|
||||
|
||||
|
@ -317,6 +318,7 @@ struct iio_channel *iio_channel_get(struct device *dev,
|
|||
if (channel != NULL)
|
||||
return channel;
|
||||
}
|
||||
|
||||
return iio_channel_get_sys(name, channel_name);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(iio_channel_get);
|
||||
|
|
|
@ -334,6 +334,15 @@ static void armada_mpic_send_doorbell(const struct cpumask *mask,
|
|||
|
||||
static void armada_xp_mpic_smp_cpu_init(void)
|
||||
{
|
||||
u32 control;
|
||||
int nr_irqs, i;
|
||||
|
||||
control = readl(main_int_base + ARMADA_370_XP_INT_CONTROL);
|
||||
nr_irqs = (control >> 2) & 0x3ff;
|
||||
|
||||
for (i = 0; i < nr_irqs; i++)
|
||||
writel(i, per_cpu_int_base + ARMADA_370_XP_INT_SET_MASK_OFFS);
|
||||
|
||||
/* Clear pending IPIs */
|
||||
writel(0, per_cpu_int_base + ARMADA_370_XP_IN_DRBEL_CAUSE_OFFS);
|
||||
|
||||
|
@ -474,7 +483,7 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node,
|
|||
struct device_node *parent)
|
||||
{
|
||||
struct resource main_int_res, per_cpu_int_res;
|
||||
int parent_irq;
|
||||
int parent_irq, nr_irqs, i;
|
||||
u32 control;
|
||||
|
||||
BUG_ON(of_address_to_resource(node, 0, &main_int_res));
|
||||
|
@ -496,9 +505,13 @@ static int __init armada_370_xp_mpic_of_init(struct device_node *node,
|
|||
BUG_ON(!per_cpu_int_base);
|
||||
|
||||
control = readl(main_int_base + ARMADA_370_XP_INT_CONTROL);
|
||||
nr_irqs = (control >> 2) & 0x3ff;
|
||||
|
||||
for (i = 0; i < nr_irqs; i++)
|
||||
writel(i, main_int_base + ARMADA_370_XP_INT_CLEAR_ENABLE_OFFS);
|
||||
|
||||
armada_370_xp_mpic_domain =
|
||||
irq_domain_add_linear(node, (control >> 2) & 0x3ff,
|
||||
irq_domain_add_linear(node, nr_irqs,
|
||||
&armada_370_xp_mpic_irq_ops, NULL);
|
||||
|
||||
BUG_ON(!armada_370_xp_mpic_domain);
|
||||
|
|
|
@ -150,7 +150,7 @@ int __init brcmstb_l2_intc_of_init(struct device_node *np,
|
|||
|
||||
/* Allocate a single Generic IRQ chip for this node */
|
||||
ret = irq_alloc_domain_generic_chips(data->domain, 32, 1,
|
||||
np->full_name, handle_level_irq, clr, 0, 0);
|
||||
np->full_name, handle_edge_irq, clr, 0, 0);
|
||||
if (ret) {
|
||||
pr_err("failed to allocate generic irq chip\n");
|
||||
goto out_free_domain;
|
||||
|
|
|
@ -125,7 +125,7 @@ static struct spear_shirq spear320_shirq_ras2 = {
|
|||
};
|
||||
|
||||
static struct spear_shirq spear320_shirq_ras3 = {
|
||||
.irq_nr = 3,
|
||||
.irq_nr = 7,
|
||||
.irq_bit_off = 0,
|
||||
.invalid_irq = 1,
|
||||
.regs = {
|
||||
|
|
|
@ -5599,7 +5599,7 @@ static int get_array_info(struct mddev * mddev, void __user * arg)
|
|||
if (mddev->in_sync)
|
||||
info.state = (1<<MD_SB_CLEAN);
|
||||
if (mddev->bitmap && mddev->bitmap_info.offset)
|
||||
info.state = (1<<MD_SB_BITMAP_PRESENT);
|
||||
info.state |= (1<<MD_SB_BITMAP_PRESENT);
|
||||
info.active_disks = insync;
|
||||
info.working_disks = working;
|
||||
info.failed_disks = failed;
|
||||
|
@ -7501,6 +7501,19 @@ void md_do_sync(struct md_thread *thread)
|
|||
rdev->recovery_offset < j)
|
||||
j = rdev->recovery_offset;
|
||||
rcu_read_unlock();
|
||||
|
||||
/* If there is a bitmap, we need to make sure all
|
||||
* writes that started before we added a spare
|
||||
* complete before we start doing a recovery.
|
||||
* Otherwise the write might complete and (via
|
||||
* bitmap_endwrite) set a bit in the bitmap after the
|
||||
* recovery has checked that bit and skipped that
|
||||
* region.
|
||||
*/
|
||||
if (mddev->bitmap) {
|
||||
mddev->pers->quiesce(mddev, 1);
|
||||
mddev->pers->quiesce(mddev, 0);
|
||||
}
|
||||
}
|
||||
|
||||
printk(KERN_INFO "md: %s of RAID array %s\n", desc, mdname(mddev));
|
||||
|
|
|
@ -880,6 +880,21 @@ void __init __weak early_init_dt_add_memory_arch(u64 base, u64 size)
|
|||
const u64 phys_offset = __pa(PAGE_OFFSET);
|
||||
base &= PAGE_MASK;
|
||||
size &= PAGE_MASK;
|
||||
|
||||
if (sizeof(phys_addr_t) < sizeof(u64)) {
|
||||
if (base > ULONG_MAX) {
|
||||
pr_warning("Ignoring memory block 0x%llx - 0x%llx\n",
|
||||
base, base + size);
|
||||
return;
|
||||
}
|
||||
|
||||
if (base + size > ULONG_MAX) {
|
||||
pr_warning("Ignoring memory range 0x%lx - 0x%llx\n",
|
||||
ULONG_MAX, base + size);
|
||||
size = ULONG_MAX - base;
|
||||
}
|
||||
}
|
||||
|
||||
if (base + size < phys_offset) {
|
||||
pr_warning("Ignoring memory block 0x%llx - 0x%llx\n",
|
||||
base, base + size);
|
||||
|
|
|
@ -4198,6 +4198,8 @@ static int hba_setup_cid_tbls(struct beiscsi_hba *phba)
|
|||
kfree(phba->ep_array);
|
||||
phba->ep_array = NULL;
|
||||
ret = -ENOMEM;
|
||||
|
||||
goto free_memory;
|
||||
}
|
||||
|
||||
for (i = 0; i < phba->params.cxns_per_ctrl; i++) {
|
||||
|
|
|
@ -1008,10 +1008,8 @@ int mgmt_set_ip(struct beiscsi_hba *phba,
|
|||
BE2_IPV6 : BE2_IPV4 ;
|
||||
|
||||
rc = mgmt_get_if_info(phba, ip_type, &if_info);
|
||||
if (rc) {
|
||||
kfree(if_info);
|
||||
if (rc)
|
||||
return rc;
|
||||
}
|
||||
|
||||
if (boot_proto == ISCSI_BOOTPROTO_DHCP) {
|
||||
if (if_info->dhcp_state) {
|
||||
|
|
|
@ -516,23 +516,17 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|||
skb_pull(skb, sizeof(struct fcoe_hdr));
|
||||
fr_len = skb->len - sizeof(struct fcoe_crc_eof);
|
||||
|
||||
stats = per_cpu_ptr(lport->stats, get_cpu());
|
||||
stats->RxFrames++;
|
||||
stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
|
||||
|
||||
fp = (struct fc_frame *)skb;
|
||||
fc_frame_init(fp);
|
||||
fr_dev(fp) = lport;
|
||||
fr_sof(fp) = hp->fcoe_sof;
|
||||
if (skb_copy_bits(skb, fr_len, &crc_eof, sizeof(crc_eof))) {
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
fr_eof(fp) = crc_eof.fcoe_eof;
|
||||
fr_crc(fp) = crc_eof.fcoe_crc32;
|
||||
if (pskb_trim(skb, fr_len)) {
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
@ -544,7 +538,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|||
port = lport_priv(vn_port);
|
||||
if (!ether_addr_equal(port->data_src_addr, dest_mac)) {
|
||||
BNX2FC_HBA_DBG(lport, "fpma mismatch\n");
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
@ -552,7 +545,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|||
if (fh->fh_r_ctl == FC_RCTL_DD_SOL_DATA &&
|
||||
fh->fh_type == FC_TYPE_FCP) {
|
||||
/* Drop FCP data. We dont this in L2 path */
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
@ -562,7 +554,6 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|||
case ELS_LOGO:
|
||||
if (ntoh24(fh->fh_s_id) == FC_FID_FLOGI) {
|
||||
/* drop non-FIP LOGO */
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
@ -572,22 +563,23 @@ static void bnx2fc_recv_frame(struct sk_buff *skb)
|
|||
|
||||
if (fh->fh_r_ctl == FC_RCTL_BA_ABTS) {
|
||||
/* Drop incoming ABTS */
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
|
||||
stats = per_cpu_ptr(lport->stats, smp_processor_id());
|
||||
stats->RxFrames++;
|
||||
stats->RxWords += fr_len / FCOE_WORD_TO_BYTE;
|
||||
|
||||
if (le32_to_cpu(fr_crc(fp)) !=
|
||||
~crc32(~0, skb->data, fr_len)) {
|
||||
if (stats->InvalidCRCCount < 5)
|
||||
printk(KERN_WARNING PFX "dropping frame with "
|
||||
"CRC error\n");
|
||||
stats->InvalidCRCCount++;
|
||||
put_cpu();
|
||||
kfree_skb(skb);
|
||||
return;
|
||||
}
|
||||
put_cpu();
|
||||
fc_exch_recv(lport, fp);
|
||||
}
|
||||
|
||||
|
|
|
@ -282,6 +282,8 @@ struct bnx2fc_cmd_mgr *bnx2fc_cmd_mgr_alloc(struct bnx2fc_hba *hba)
|
|||
arr_sz, GFP_KERNEL);
|
||||
if (!cmgr->free_list_lock) {
|
||||
printk(KERN_ERR PFX "failed to alloc free_list_lock\n");
|
||||
kfree(cmgr->free_list);
|
||||
cmgr->free_list = NULL;
|
||||
goto mem_err;
|
||||
}
|
||||
|
||||
|
|
|
@ -185,6 +185,11 @@ static struct viosrp_crq *crq_queue_next_crq(struct crq_queue *queue)
|
|||
if (crq->valid & 0x80) {
|
||||
if (++queue->cur == queue->size)
|
||||
queue->cur = 0;
|
||||
|
||||
/* Ensure the read of the valid bit occurs before reading any
|
||||
* other bits of the CRQ entry
|
||||
*/
|
||||
rmb();
|
||||
} else
|
||||
crq = NULL;
|
||||
spin_unlock_irqrestore(&queue->lock, flags);
|
||||
|
@ -203,6 +208,11 @@ static int ibmvscsi_send_crq(struct ibmvscsi_host_data *hostdata,
|
|||
{
|
||||
struct vio_dev *vdev = to_vio_dev(hostdata->dev);
|
||||
|
||||
/*
|
||||
* Ensure the command buffer is flushed to memory before handing it
|
||||
* over to the VIOS to prevent it from fetching any stale data.
|
||||
*/
|
||||
mb();
|
||||
return plpar_hcall_norets(H_SEND_CRQ, vdev->unit_address, word1, word2);
|
||||
}
|
||||
|
||||
|
@ -797,7 +807,8 @@ static void purge_requests(struct ibmvscsi_host_data *hostdata, int error_code)
|
|||
evt->hostdata->dev);
|
||||
if (evt->cmnd_done)
|
||||
evt->cmnd_done(evt->cmnd);
|
||||
} else if (evt->done)
|
||||
} else if (evt->done && evt->crq.format != VIOSRP_MAD_FORMAT &&
|
||||
evt->iu.srp.login_req.opcode != SRP_LOGIN_REQ)
|
||||
evt->done(evt);
|
||||
free_event_struct(&evt->hostdata->pool, evt);
|
||||
spin_lock_irqsave(hostdata->host->host_lock, flags);
|
||||
|
|
|
@ -677,7 +677,7 @@ static void pm8001_init_sas_add(struct pm8001_hba_info *pm8001_ha)
|
|||
* pm8001_get_phy_settings_info : Read phy setting values.
|
||||
* @pm8001_ha : our hba.
|
||||
*/
|
||||
void pm8001_get_phy_settings_info(struct pm8001_hba_info *pm8001_ha)
|
||||
static int pm8001_get_phy_settings_info(struct pm8001_hba_info *pm8001_ha)
|
||||
{
|
||||
|
||||
#ifdef PM8001_READ_VPD
|
||||
|
@ -691,11 +691,15 @@ void pm8001_get_phy_settings_info(struct pm8001_hba_info *pm8001_ha)
|
|||
payload.offset = 0;
|
||||
payload.length = 4096;
|
||||
payload.func_specific = kzalloc(4096, GFP_KERNEL);
|
||||
if (!payload.func_specific)
|
||||
return -ENOMEM;
|
||||
/* Read phy setting values from flash */
|
||||
PM8001_CHIP_DISP->get_nvmd_req(pm8001_ha, &payload);
|
||||
wait_for_completion(&completion);
|
||||
pm8001_set_phy_profile(pm8001_ha, sizeof(u8), payload.func_specific);
|
||||
kfree(payload.func_specific);
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifdef PM8001_USE_MSIX
|
||||
|
@ -879,8 +883,11 @@ static int pm8001_pci_probe(struct pci_dev *pdev,
|
|||
pm8001_init_sas_add(pm8001_ha);
|
||||
/* phy setting support for motherboard controller */
|
||||
if (pdev->subsystem_vendor != PCI_VENDOR_ID_ADAPTEC2 &&
|
||||
pdev->subsystem_vendor != 0)
|
||||
pm8001_get_phy_settings_info(pm8001_ha);
|
||||
pdev->subsystem_vendor != 0) {
|
||||
rc = pm8001_get_phy_settings_info(pm8001_ha);
|
||||
if (rc)
|
||||
goto err_out_shost;
|
||||
}
|
||||
pm8001_post_sas_ha_init(shost, chip);
|
||||
rc = sas_register_ha(SHOST_TO_SAS_HA(shost));
|
||||
if (rc)
|
||||
|
|
|
@ -1128,7 +1128,7 @@ static void qlt_24xx_retry_term_exchange(struct scsi_qla_host *vha,
|
|||
ctio->u.status1.flags =
|
||||
__constant_cpu_to_le16(CTIO7_FLAGS_STATUS_MODE_1 |
|
||||
CTIO7_FLAGS_TERMINATE);
|
||||
ctio->u.status1.ox_id = entry->fcp_hdr_le.ox_id;
|
||||
ctio->u.status1.ox_id = cpu_to_le16(entry->fcp_hdr_le.ox_id);
|
||||
|
||||
qla2x00_start_iocbs(vha, vha->req);
|
||||
|
||||
|
@ -1262,6 +1262,7 @@ static void qlt_24xx_send_task_mgmt_ctio(struct scsi_qla_host *ha,
|
|||
{
|
||||
struct atio_from_isp *atio = &mcmd->orig_iocb.atio;
|
||||
struct ctio7_to_24xx *ctio;
|
||||
uint16_t temp;
|
||||
|
||||
ql_dbg(ql_dbg_tgt, ha, 0xe008,
|
||||
"Sending task mgmt CTIO7 (ha=%p, atio=%p, resp_code=%x\n",
|
||||
|
@ -1292,7 +1293,8 @@ static void qlt_24xx_send_task_mgmt_ctio(struct scsi_qla_host *ha,
|
|||
ctio->u.status1.flags = (atio->u.isp24.attr << 9) |
|
||||
__constant_cpu_to_le16(CTIO7_FLAGS_STATUS_MODE_1 |
|
||||
CTIO7_FLAGS_SEND_STATUS);
|
||||
ctio->u.status1.ox_id = swab16(atio->u.isp24.fcp_hdr.ox_id);
|
||||
temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
|
||||
ctio->u.status1.ox_id = cpu_to_le16(temp);
|
||||
ctio->u.status1.scsi_status =
|
||||
__constant_cpu_to_le16(SS_RESPONSE_INFO_LEN_VALID);
|
||||
ctio->u.status1.response_len = __constant_cpu_to_le16(8);
|
||||
|
@ -1513,6 +1515,7 @@ static int qlt_24xx_build_ctio_pkt(struct qla_tgt_prm *prm,
|
|||
struct ctio7_to_24xx *pkt;
|
||||
struct qla_hw_data *ha = vha->hw;
|
||||
struct atio_from_isp *atio = &prm->cmd->atio;
|
||||
uint16_t temp;
|
||||
|
||||
pkt = (struct ctio7_to_24xx *)vha->req->ring_ptr;
|
||||
prm->pkt = pkt;
|
||||
|
@ -1541,13 +1544,13 @@ static int qlt_24xx_build_ctio_pkt(struct qla_tgt_prm *prm,
|
|||
pkt->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0];
|
||||
pkt->exchange_addr = atio->u.isp24.exchange_addr;
|
||||
pkt->u.status0.flags |= (atio->u.isp24.attr << 9);
|
||||
pkt->u.status0.ox_id = swab16(atio->u.isp24.fcp_hdr.ox_id);
|
||||
temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
|
||||
pkt->u.status0.ox_id = cpu_to_le16(temp);
|
||||
pkt->u.status0.relative_offset = cpu_to_le32(prm->cmd->offset);
|
||||
|
||||
ql_dbg(ql_dbg_tgt, vha, 0xe00c,
|
||||
"qla_target(%d): handle(cmd) -> %08x, timeout %d, ox_id %#x\n",
|
||||
vha->vp_idx, pkt->handle, QLA_TGT_TIMEOUT,
|
||||
le16_to_cpu(pkt->u.status0.ox_id));
|
||||
vha->vp_idx, pkt->handle, QLA_TGT_TIMEOUT, temp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -2619,6 +2622,7 @@ static int __qlt_send_term_exchange(struct scsi_qla_host *vha,
|
|||
struct qla_hw_data *ha = vha->hw;
|
||||
request_t *pkt;
|
||||
int ret = 0;
|
||||
uint16_t temp;
|
||||
|
||||
ql_dbg(ql_dbg_tgt, vha, 0xe01c, "Sending TERM EXCH CTIO (ha=%p)\n", ha);
|
||||
|
||||
|
@ -2655,7 +2659,8 @@ static int __qlt_send_term_exchange(struct scsi_qla_host *vha,
|
|||
ctio24->u.status1.flags = (atio->u.isp24.attr << 9) |
|
||||
__constant_cpu_to_le16(CTIO7_FLAGS_STATUS_MODE_1 |
|
||||
CTIO7_FLAGS_TERMINATE);
|
||||
ctio24->u.status1.ox_id = swab16(atio->u.isp24.fcp_hdr.ox_id);
|
||||
temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
|
||||
ctio24->u.status1.ox_id = cpu_to_le16(temp);
|
||||
|
||||
/* Most likely, it isn't needed */
|
||||
ctio24->u.status1.residual = get_unaligned((uint32_t *)
|
||||
|
|
|
@ -443,7 +443,7 @@ struct ctio7_to_24xx {
|
|||
uint16_t reserved1;
|
||||
__le16 flags;
|
||||
uint32_t residual;
|
||||
uint16_t ox_id;
|
||||
__le16 ox_id;
|
||||
uint16_t scsi_status;
|
||||
uint32_t relative_offset;
|
||||
uint32_t reserved2;
|
||||
|
@ -458,7 +458,7 @@ struct ctio7_to_24xx {
|
|||
uint16_t sense_length;
|
||||
uint16_t flags;
|
||||
uint32_t residual;
|
||||
uint16_t ox_id;
|
||||
__le16 ox_id;
|
||||
uint16_t scsi_status;
|
||||
uint16_t response_len;
|
||||
uint16_t reserved;
|
||||
|
|
|
@ -131,7 +131,7 @@ scmd_eh_abort_handler(struct work_struct *work)
|
|||
"aborting command %p\n", scmd));
|
||||
rtn = scsi_try_to_abort_cmd(sdev->host->hostt, scmd);
|
||||
if (rtn == SUCCESS) {
|
||||
scmd->result |= DID_TIME_OUT << 16;
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
if (scsi_host_eh_past_deadline(sdev->host)) {
|
||||
SCSI_LOG_ERROR_RECOVERY(3,
|
||||
scmd_printk(KERN_INFO, scmd,
|
||||
|
@ -167,7 +167,7 @@ scmd_eh_abort_handler(struct work_struct *work)
|
|||
scmd_printk(KERN_WARNING, scmd,
|
||||
"scmd %p terminate "
|
||||
"aborted command\n", scmd));
|
||||
scmd->result |= DID_TIME_OUT << 16;
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
scsi_finish_command(scmd);
|
||||
}
|
||||
}
|
||||
|
@ -287,15 +287,15 @@ enum blk_eh_timer_return scsi_times_out(struct request *req)
|
|||
else if (host->hostt->eh_timed_out)
|
||||
rtn = host->hostt->eh_timed_out(scmd);
|
||||
|
||||
if (rtn == BLK_EH_NOT_HANDLED && !host->hostt->no_async_abort)
|
||||
if (scsi_abort_command(scmd) == SUCCESS)
|
||||
if (rtn == BLK_EH_NOT_HANDLED) {
|
||||
if (!host->hostt->no_async_abort &&
|
||||
scsi_abort_command(scmd) == SUCCESS)
|
||||
return BLK_EH_NOT_HANDLED;
|
||||
|
||||
scmd->result |= DID_TIME_OUT << 16;
|
||||
|
||||
if (unlikely(rtn == BLK_EH_NOT_HANDLED &&
|
||||
!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD)))
|
||||
rtn = BLK_EH_HANDLED;
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
if (!scsi_eh_scmd_add(scmd, SCSI_EH_CANCEL_CMD))
|
||||
rtn = BLK_EH_HANDLED;
|
||||
}
|
||||
|
||||
return rtn;
|
||||
}
|
||||
|
@ -1777,7 +1777,7 @@ int scsi_decide_disposition(struct scsi_cmnd *scmd)
|
|||
break;
|
||||
case DID_ABORT:
|
||||
if (scmd->eh_eflags & SCSI_EH_ABORT_SCHEDULED) {
|
||||
scmd->result |= DID_TIME_OUT << 16;
|
||||
set_host_byte(scmd, DID_TIME_OUT);
|
||||
return SUCCESS;
|
||||
}
|
||||
case DID_NO_CONNECT:
|
||||
|
|
|
@ -2549,6 +2549,7 @@ fc_rport_final_delete(struct work_struct *work)
|
|||
fc_flush_devloss(shost);
|
||||
if (!cancel_delayed_work(&rport->dev_loss_work))
|
||||
fc_flush_devloss(shost);
|
||||
cancel_work_sync(&rport->scan_work);
|
||||
spin_lock_irqsave(shost->host_lock, flags);
|
||||
rport->flags &= ~FC_RPORT_DEVLOSS_PENDING;
|
||||
}
|
||||
|
|
|
@ -2441,7 +2441,10 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
|
|||
}
|
||||
|
||||
sdkp->DPOFUA = (data.device_specific & 0x10) != 0;
|
||||
if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
|
||||
if (sdp->broken_fua) {
|
||||
sd_first_printk(KERN_NOTICE, sdkp, "Disabling FUA\n");
|
||||
sdkp->DPOFUA = 0;
|
||||
} else if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
|
||||
sd_first_printk(KERN_NOTICE, sdkp,
|
||||
"Uses READ/WRITE(6), disabling FUA\n");
|
||||
sdkp->DPOFUA = 0;
|
||||
|
|
|
@ -237,6 +237,16 @@ static void virtscsi_req_done(struct virtqueue *vq)
|
|||
virtscsi_vq_done(vscsi, req_vq, virtscsi_complete_cmd);
|
||||
};
|
||||
|
||||
static void virtscsi_poll_requests(struct virtio_scsi *vscsi)
|
||||
{
|
||||
int i, num_vqs;
|
||||
|
||||
num_vqs = vscsi->num_queues;
|
||||
for (i = 0; i < num_vqs; i++)
|
||||
virtscsi_vq_done(vscsi, &vscsi->req_vqs[i],
|
||||
virtscsi_complete_cmd);
|
||||
}
|
||||
|
||||
static void virtscsi_complete_free(struct virtio_scsi *vscsi, void *buf)
|
||||
{
|
||||
struct virtio_scsi_cmd *cmd = buf;
|
||||
|
@ -253,6 +263,8 @@ static void virtscsi_ctrl_done(struct virtqueue *vq)
|
|||
virtscsi_vq_done(vscsi, &vscsi->ctrl_vq, virtscsi_complete_free);
|
||||
};
|
||||
|
||||
static void virtscsi_handle_event(struct work_struct *work);
|
||||
|
||||
static int virtscsi_kick_event(struct virtio_scsi *vscsi,
|
||||
struct virtio_scsi_event_node *event_node)
|
||||
{
|
||||
|
@ -260,6 +272,7 @@ static int virtscsi_kick_event(struct virtio_scsi *vscsi,
|
|||
struct scatterlist sg;
|
||||
unsigned long flags;
|
||||
|
||||
INIT_WORK(&event_node->work, virtscsi_handle_event);
|
||||
sg_init_one(&sg, &event_node->event, sizeof(struct virtio_scsi_event));
|
||||
|
||||
spin_lock_irqsave(&vscsi->event_vq.vq_lock, flags);
|
||||
|
@ -377,7 +390,6 @@ static void virtscsi_complete_event(struct virtio_scsi *vscsi, void *buf)
|
|||
{
|
||||
struct virtio_scsi_event_node *event_node = buf;
|
||||
|
||||
INIT_WORK(&event_node->work, virtscsi_handle_event);
|
||||
schedule_work(&event_node->work);
|
||||
}
|
||||
|
||||
|
@ -589,6 +601,18 @@ static int virtscsi_tmf(struct virtio_scsi *vscsi, struct virtio_scsi_cmd *cmd)
|
|||
cmd->resp.tmf.response == VIRTIO_SCSI_S_FUNCTION_SUCCEEDED)
|
||||
ret = SUCCESS;
|
||||
|
||||
/*
|
||||
* The spec guarantees that all requests related to the TMF have
|
||||
* been completed, but the callback might not have run yet if
|
||||
* we're using independent interrupts (e.g. MSI). Poll the
|
||||
* virtqueues once.
|
||||
*
|
||||
* In the abort case, sc->scsi_done will do nothing, because
|
||||
* the block layer must have detected a timeout and as a result
|
||||
* REQ_ATOM_COMPLETE has been set.
|
||||
*/
|
||||
virtscsi_poll_requests(vscsi);
|
||||
|
||||
out:
|
||||
mempool_free(cmd, virtscsi_cmd_pool);
|
||||
return ret;
|
||||
|
|
|
@ -465,7 +465,7 @@ static int ad7291_probe(struct i2c_client *client,
|
|||
struct ad7291_platform_data *pdata = client->dev.platform_data;
|
||||
struct ad7291_chip_info *chip;
|
||||
struct iio_dev *indio_dev;
|
||||
int ret = 0;
|
||||
int ret;
|
||||
|
||||
indio_dev = devm_iio_device_alloc(&client->dev, sizeof(*chip));
|
||||
if (!indio_dev)
|
||||
|
@ -475,7 +475,7 @@ static int ad7291_probe(struct i2c_client *client,
|
|||
if (pdata && pdata->use_external_ref) {
|
||||
chip->reg = devm_regulator_get(&client->dev, "vref");
|
||||
if (IS_ERR(chip->reg))
|
||||
return ret;
|
||||
return PTR_ERR(chip->reg);
|
||||
|
||||
ret = regulator_enable(chip->reg);
|
||||
if (ret)
|
||||
|
|
|
@ -280,8 +280,10 @@ static int bridge_brd_monitor(struct bridge_dev_context *dev_ctxt)
|
|||
OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL);
|
||||
|
||||
/* Wait until the state has moved to ON */
|
||||
while (*pdata->dsp_prm_read(OMAP3430_IVA2_MOD, OMAP2_PM_PWSTST)&
|
||||
OMAP_INTRANSITION_MASK);
|
||||
while ((*pdata->dsp_prm_read)(OMAP3430_IVA2_MOD,
|
||||
OMAP2_PM_PWSTST) &
|
||||
OMAP_INTRANSITION_MASK)
|
||||
;
|
||||
/* Disable Automatic transition */
|
||||
(*pdata->dsp_cm_write)(OMAP34XX_CLKSTCTRL_DISABLE_AUTO,
|
||||
OMAP3430_IVA2_MOD, OMAP2_CM_CLKSTCTRL);
|
||||
|
|
|
@ -1321,6 +1321,7 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req)
|
|||
struct ci_hw_ep *hwep = container_of(ep, struct ci_hw_ep, ep);
|
||||
struct ci_hw_req *hwreq = container_of(req, struct ci_hw_req, req);
|
||||
unsigned long flags;
|
||||
struct td_node *node, *tmpnode;
|
||||
|
||||
if (ep == NULL || req == NULL || hwreq->req.status != -EALREADY ||
|
||||
hwep->ep.desc == NULL || list_empty(&hwreq->queue) ||
|
||||
|
@ -1331,6 +1332,12 @@ static int ep_dequeue(struct usb_ep *ep, struct usb_request *req)
|
|||
|
||||
hw_ep_flush(hwep->ci, hwep->num, hwep->dir);
|
||||
|
||||
list_for_each_entry_safe(node, tmpnode, &hwreq->tds, td) {
|
||||
dma_pool_free(hwep->td_pool, node->ptr, node->dma);
|
||||
list_del(&node->td);
|
||||
kfree(node);
|
||||
}
|
||||
|
||||
/* pop request */
|
||||
list_del_init(&hwreq->queue);
|
||||
|
||||
|
|
|
@ -45,6 +45,7 @@ comment "Platform Glue Driver Support"
|
|||
config USB_DWC3_OMAP
|
||||
tristate "Texas Instruments OMAP5 and similar Platforms"
|
||||
depends on EXTCON && (ARCH_OMAP2PLUS || COMPILE_TEST)
|
||||
depends on OF
|
||||
default USB_DWC3
|
||||
help
|
||||
Some platforms from Texas Instruments like OMAP5, DRA7xxx and
|
||||
|
|
|
@ -322,7 +322,7 @@ static int dwc3_omap_remove_core(struct device *dev, void *c)
|
|||
{
|
||||
struct platform_device *pdev = to_platform_device(dev);
|
||||
|
||||
platform_device_unregister(pdev);
|
||||
of_device_unregister(pdev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -599,7 +599,7 @@ static int dwc3_omap_prepare(struct device *dev)
|
|||
{
|
||||
struct dwc3_omap *omap = dev_get_drvdata(dev);
|
||||
|
||||
dwc3_omap_disable_irqs(omap);
|
||||
dwc3_omap_write_irqmisc_set(omap, 0x00);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -607,8 +607,19 @@ static int dwc3_omap_prepare(struct device *dev)
|
|||
static void dwc3_omap_complete(struct device *dev)
|
||||
{
|
||||
struct dwc3_omap *omap = dev_get_drvdata(dev);
|
||||
u32 reg;
|
||||
|
||||
dwc3_omap_enable_irqs(omap);
|
||||
reg = (USBOTGSS_IRQMISC_OEVT |
|
||||
USBOTGSS_IRQMISC_DRVVBUS_RISE |
|
||||
USBOTGSS_IRQMISC_CHRGVBUS_RISE |
|
||||
USBOTGSS_IRQMISC_DISCHRGVBUS_RISE |
|
||||
USBOTGSS_IRQMISC_IDPULLUP_RISE |
|
||||
USBOTGSS_IRQMISC_DRVVBUS_FALL |
|
||||
USBOTGSS_IRQMISC_CHRGVBUS_FALL |
|
||||
USBOTGSS_IRQMISC_DISCHRGVBUS_FALL |
|
||||
USBOTGSS_IRQMISC_IDPULLUP_FALL);
|
||||
|
||||
dwc3_omap_write_irqmisc_set(omap, reg);
|
||||
}
|
||||
|
||||
static int dwc3_omap_suspend(struct device *dev)
|
||||
|
|
|
@ -828,10 +828,6 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
|
|||
length, last ? " last" : "",
|
||||
chain ? " chain" : "");
|
||||
|
||||
/* Skip the LINK-TRB on ISOC */
|
||||
if (((dep->free_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
|
||||
usb_endpoint_xfer_isoc(dep->endpoint.desc))
|
||||
dep->free_slot++;
|
||||
|
||||
trb = &dep->trb_pool[dep->free_slot & DWC3_TRB_MASK];
|
||||
|
||||
|
@ -843,6 +839,10 @@ static void dwc3_prepare_one_trb(struct dwc3_ep *dep,
|
|||
}
|
||||
|
||||
dep->free_slot++;
|
||||
/* Skip the LINK-TRB on ISOC */
|
||||
if (((dep->free_slot & DWC3_TRB_MASK) == DWC3_TRB_NUM - 1) &&
|
||||
usb_endpoint_xfer_isoc(dep->endpoint.desc))
|
||||
dep->free_slot++;
|
||||
|
||||
trb->size = DWC3_TRB_SIZE_LENGTH(length);
|
||||
trb->bpl = lower_32_bits(dma);
|
||||
|
|
|
@ -1145,15 +1145,15 @@ static struct configfs_item_operations interf_item_ops = {
|
|||
.store_attribute = usb_os_desc_attr_store,
|
||||
};
|
||||
|
||||
static ssize_t rndis_grp_compatible_id_show(struct usb_os_desc *desc,
|
||||
char *page)
|
||||
static ssize_t interf_grp_compatible_id_show(struct usb_os_desc *desc,
|
||||
char *page)
|
||||
{
|
||||
memcpy(page, desc->ext_compat_id, 8);
|
||||
return 8;
|
||||
}
|
||||
|
||||
static ssize_t rndis_grp_compatible_id_store(struct usb_os_desc *desc,
|
||||
const char *page, size_t len)
|
||||
static ssize_t interf_grp_compatible_id_store(struct usb_os_desc *desc,
|
||||
const char *page, size_t len)
|
||||
{
|
||||
int l;
|
||||
|
||||
|
@ -1171,20 +1171,20 @@ static ssize_t rndis_grp_compatible_id_store(struct usb_os_desc *desc,
|
|||
return len;
|
||||
}
|
||||
|
||||
static struct usb_os_desc_attribute rndis_grp_attr_compatible_id =
|
||||
static struct usb_os_desc_attribute interf_grp_attr_compatible_id =
|
||||
__CONFIGFS_ATTR(compatible_id, S_IRUGO | S_IWUSR,
|
||||
rndis_grp_compatible_id_show,
|
||||
rndis_grp_compatible_id_store);
|
||||
interf_grp_compatible_id_show,
|
||||
interf_grp_compatible_id_store);
|
||||
|
||||
static ssize_t rndis_grp_sub_compatible_id_show(struct usb_os_desc *desc,
|
||||
char *page)
|
||||
static ssize_t interf_grp_sub_compatible_id_show(struct usb_os_desc *desc,
|
||||
char *page)
|
||||
{
|
||||
memcpy(page, desc->ext_compat_id + 8, 8);
|
||||
return 8;
|
||||
}
|
||||
|
||||
static ssize_t rndis_grp_sub_compatible_id_store(struct usb_os_desc *desc,
|
||||
const char *page, size_t len)
|
||||
static ssize_t interf_grp_sub_compatible_id_store(struct usb_os_desc *desc,
|
||||
const char *page, size_t len)
|
||||
{
|
||||
int l;
|
||||
|
||||
|
@ -1202,20 +1202,21 @@ static ssize_t rndis_grp_sub_compatible_id_store(struct usb_os_desc *desc,
|
|||
return len;
|
||||
}
|
||||
|
||||
static struct usb_os_desc_attribute rndis_grp_attr_sub_compatible_id =
|
||||
static struct usb_os_desc_attribute interf_grp_attr_sub_compatible_id =
|
||||
__CONFIGFS_ATTR(sub_compatible_id, S_IRUGO | S_IWUSR,
|
||||
rndis_grp_sub_compatible_id_show,
|
||||
rndis_grp_sub_compatible_id_store);
|
||||
interf_grp_sub_compatible_id_show,
|
||||
interf_grp_sub_compatible_id_store);
|
||||
|
||||
static struct configfs_attribute *interf_grp_attrs[] = {
|
||||
&rndis_grp_attr_compatible_id.attr,
|
||||
&rndis_grp_attr_sub_compatible_id.attr,
|
||||
&interf_grp_attr_compatible_id.attr,
|
||||
&interf_grp_attr_sub_compatible_id.attr,
|
||||
NULL
|
||||
};
|
||||
|
||||
int usb_os_desc_prepare_interf_dir(struct config_group *parent,
|
||||
int n_interf,
|
||||
struct usb_os_desc **desc,
|
||||
char **names,
|
||||
struct module *owner)
|
||||
{
|
||||
struct config_group **f_default_groups, *os_desc_group,
|
||||
|
@ -1257,8 +1258,8 @@ int usb_os_desc_prepare_interf_dir(struct config_group *parent,
|
|||
d = desc[n_interf];
|
||||
d->owner = owner;
|
||||
config_group_init_type_name(&d->group, "", interface_type);
|
||||
config_item_set_name(&d->group.cg_item, "interface.%d",
|
||||
n_interf);
|
||||
config_item_set_name(&d->group.cg_item, "interface.%s",
|
||||
names[n_interf]);
|
||||
interface_groups[n_interf] = &d->group;
|
||||
}
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@ void unregister_gadget_item(struct config_item *item);
|
|||
int usb_os_desc_prepare_interf_dir(struct config_group *parent,
|
||||
int n_interf,
|
||||
struct usb_os_desc **desc,
|
||||
char **names,
|
||||
struct module *owner);
|
||||
|
||||
static inline struct usb_os_desc *to_usb_os_desc(struct config_item *item)
|
||||
|
|
|
@ -1483,11 +1483,13 @@ static int functionfs_bind(struct ffs_data *ffs, struct usb_composite_dev *cdev)
|
|||
ffs->ep0req->context = ffs;
|
||||
|
||||
lang = ffs->stringtabs;
|
||||
for (lang = ffs->stringtabs; *lang; ++lang) {
|
||||
struct usb_string *str = (*lang)->strings;
|
||||
int id = first_id;
|
||||
for (; str->s; ++id, ++str)
|
||||
str->id = id;
|
||||
if (lang) {
|
||||
for (; *lang; ++lang) {
|
||||
struct usb_string *str = (*lang)->strings;
|
||||
int id = first_id;
|
||||
for (; str->s; ++id, ++str)
|
||||
str->id = id;
|
||||
}
|
||||
}
|
||||
|
||||
ffs->gadget = cdev->gadget;
|
||||
|
|
|
@ -687,7 +687,7 @@ rndis_bind(struct usb_configuration *c, struct usb_function *f)
|
|||
f->os_desc_table = kzalloc(sizeof(*f->os_desc_table),
|
||||
GFP_KERNEL);
|
||||
if (!f->os_desc_table)
|
||||
return PTR_ERR(f->os_desc_table);
|
||||
return -ENOMEM;
|
||||
f->os_desc_n = 1;
|
||||
f->os_desc_table[0].os_desc = &rndis_opts->rndis_os_desc;
|
||||
}
|
||||
|
@ -905,6 +905,7 @@ static struct usb_function_instance *rndis_alloc_inst(void)
|
|||
{
|
||||
struct f_rndis_opts *opts;
|
||||
struct usb_os_desc *descs[1];
|
||||
char *names[1];
|
||||
|
||||
opts = kzalloc(sizeof(*opts), GFP_KERNEL);
|
||||
if (!opts)
|
||||
|
@ -922,8 +923,9 @@ static struct usb_function_instance *rndis_alloc_inst(void)
|
|||
INIT_LIST_HEAD(&opts->rndis_os_desc.ext_prop);
|
||||
|
||||
descs[0] = &opts->rndis_os_desc;
|
||||
names[0] = "rndis";
|
||||
usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs,
|
||||
THIS_MODULE);
|
||||
names, THIS_MODULE);
|
||||
config_group_init_type_name(&opts->func_inst.group, "",
|
||||
&rndis_func_type);
|
||||
|
||||
|
|
|
@ -1532,8 +1532,9 @@ static int gr_ep_enable(struct usb_ep *_ep,
|
|||
"%s mode: multiple trans./microframe not valid\n",
|
||||
(mode == 2 ? "Bulk" : "Control"));
|
||||
return -EINVAL;
|
||||
} else if (nt == 0x11) {
|
||||
dev_err(dev->dev, "Invalid value for trans./microframe\n");
|
||||
} else if (nt == 0x3) {
|
||||
dev_err(dev->dev,
|
||||
"Invalid value 0x3 for additional trans./microframe\n");
|
||||
return -EINVAL;
|
||||
} else if ((nt + 1) * max > buffer_size) {
|
||||
dev_err(dev->dev, "Hw buffer size %d < max payload %d * %d\n",
|
||||
|
|
|
@ -1264,8 +1264,13 @@ dev_release (struct inode *inode, struct file *fd)
|
|||
|
||||
kfree (dev->buf);
|
||||
dev->buf = NULL;
|
||||
put_dev (dev);
|
||||
|
||||
/* other endpoints were all decoupled from this device */
|
||||
spin_lock_irq(&dev->lock);
|
||||
dev->state = STATE_DEV_DISABLED;
|
||||
spin_unlock_irq(&dev->lock);
|
||||
|
||||
put_dev (dev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1120,7 +1120,10 @@ void gether_disconnect(struct gether *link)
|
|||
|
||||
DBG(dev, "%s\n", __func__);
|
||||
|
||||
netif_tx_lock(dev->net);
|
||||
netif_stop_queue(dev->net);
|
||||
netif_tx_unlock(dev->net);
|
||||
|
||||
netif_carrier_off(dev->net);
|
||||
|
||||
/* disable endpoints, forcing (synchronous) completion
|
||||
|
|
|
@ -176,7 +176,7 @@ config USB_EHCI_HCD_AT91
|
|||
|
||||
config USB_EHCI_MSM
|
||||
tristate "Support for Qualcomm QSD/MSM on-chip EHCI USB controller"
|
||||
depends on ARCH_MSM
|
||||
depends on ARCH_MSM || ARCH_QCOM
|
||||
select USB_EHCI_ROOT_HUB_TT
|
||||
---help---
|
||||
Enables support for the USB Host controller present on the
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
|
||||
|
||||
#include <linux/slab.h>
|
||||
#include <linux/device.h>
|
||||
#include <asm/unaligned.h>
|
||||
|
||||
#include "xhci.h"
|
||||
|
@ -1139,7 +1140,9 @@ int xhci_bus_suspend(struct usb_hcd *hcd)
|
|||
* including the USB 3.0 roothub, but only if CONFIG_PM_RUNTIME
|
||||
* is enabled, so also enable remote wake here.
|
||||
*/
|
||||
if (hcd->self.root_hub->do_remote_wakeup) {
|
||||
if (hcd->self.root_hub->do_remote_wakeup
|
||||
&& device_may_wakeup(hcd->self.controller)) {
|
||||
|
||||
if (t1 & PORT_CONNECT) {
|
||||
t2 |= PORT_WKOC_E | PORT_WKDISC_E;
|
||||
t2 &= ~PORT_WKCONN_E;
|
||||
|
|
|
@ -1433,8 +1433,11 @@ static void handle_cmd_completion(struct xhci_hcd *xhci,
|
|||
xhci_handle_cmd_reset_ep(xhci, slot_id, cmd_trb, cmd_comp_code);
|
||||
break;
|
||||
case TRB_RESET_DEV:
|
||||
WARN_ON(slot_id != TRB_TO_SLOT_ID(
|
||||
le32_to_cpu(cmd_trb->generic.field[3])));
|
||||
/* SLOT_ID field in reset device cmd completion event TRB is 0.
|
||||
* Use the SLOT_ID from the command TRB instead (xhci 4.6.11)
|
||||
*/
|
||||
slot_id = TRB_TO_SLOT_ID(
|
||||
le32_to_cpu(cmd_trb->generic.field[3]));
|
||||
xhci_handle_cmd_reset_dev(xhci, slot_id, event);
|
||||
break;
|
||||
case TRB_NEC_GET_FW:
|
||||
|
@ -3534,7 +3537,7 @@ static unsigned int xhci_get_burst_count(struct xhci_hcd *xhci,
|
|||
return 0;
|
||||
|
||||
max_burst = urb->ep->ss_ep_comp.bMaxBurst;
|
||||
return roundup(total_packet_count, max_burst + 1) - 1;
|
||||
return DIV_ROUND_UP(total_packet_count, max_burst + 1) - 1;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -936,7 +936,7 @@ int xhci_suspend(struct xhci_hcd *xhci)
|
|||
*/
|
||||
int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
||||
{
|
||||
u32 command, temp = 0;
|
||||
u32 command, temp = 0, status;
|
||||
struct usb_hcd *hcd = xhci_to_hcd(xhci);
|
||||
struct usb_hcd *secondary_hcd;
|
||||
int retval = 0;
|
||||
|
@ -1054,8 +1054,12 @@ int xhci_resume(struct xhci_hcd *xhci, bool hibernated)
|
|||
|
||||
done:
|
||||
if (retval == 0) {
|
||||
usb_hcd_resume_root_hub(hcd);
|
||||
usb_hcd_resume_root_hub(xhci->shared_hcd);
|
||||
/* Resume root hubs only when have pending events. */
|
||||
status = readl(&xhci->op_regs->status);
|
||||
if (status & STS_EINT) {
|
||||
usb_hcd_resume_root_hub(hcd);
|
||||
usb_hcd_resume_root_hub(xhci->shared_hcd);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue