Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net

This commit is contained in:
David S. Miller 2014-11-29 20:47:48 -08:00
commit 60b7379dc5
193 changed files with 1306 additions and 840 deletions

View File

@ -64,7 +64,7 @@ is formed.
At mount time, the two directories given as mount options "lowerdir" and At mount time, the two directories given as mount options "lowerdir" and
"upperdir" are combined into a merged directory: "upperdir" are combined into a merged directory:
mount -t overlayfs overlayfs -olowerdir=/lower,upperdir=/upper,\ mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,\
workdir=/work /merged workdir=/work /merged
The "workdir" needs to be an empty directory on the same filesystem The "workdir" needs to be an empty directory on the same filesystem

View File

@ -136,7 +136,7 @@ SOF_TIMESTAMPING_OPT_ID:
This option is implemented only for transmit timestamps. There, the This option is implemented only for transmit timestamps. There, the
timestamp is always looped along with a struct sock_extended_err. timestamp is always looped along with a struct sock_extended_err.
The option modifies field ee_info to pass an id that is unique The option modifies field ee_data to pass an id that is unique
among all possibly concurrently outstanding timestamp requests for among all possibly concurrently outstanding timestamp requests for
that socket. In practice, it is a monotonically increasing u32 that socket. In practice, it is a monotonically increasing u32
(that wraps). (that wraps).

View File

@ -6908,11 +6908,12 @@ F: drivers/scsi/osd/
F: include/scsi/osd_* F: include/scsi/osd_*
F: fs/exofs/ F: fs/exofs/
OVERLAYFS FILESYSTEM OVERLAY FILESYSTEM
M: Miklos Szeredi <miklos@szeredi.hu> M: Miklos Szeredi <miklos@szeredi.hu>
L: linux-fsdevel@vger.kernel.org L: linux-unionfs@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/mszeredi/vfs.git
S: Supported S: Supported
F: fs/overlayfs/* F: fs/overlayfs/
F: Documentation/filesystems/overlayfs.txt F: Documentation/filesystems/overlayfs.txt
P54 WIRELESS DRIVER P54 WIRELESS DRIVER

View File

@ -1,7 +1,7 @@
VERSION = 3 VERSION = 3
PATCHLEVEL = 18 PATCHLEVEL = 18
SUBLEVEL = 0 SUBLEVEL = 0
EXTRAVERSION = -rc5 EXTRAVERSION = -rc6
NAME = Diseased Newt NAME = Diseased Newt
# *DOCUMENTATION* # *DOCUMENTATION*

View File

@ -624,4 +624,8 @@
num-cs = <1>; num-cs = <1>;
}; };
&usbdrd_dwc3 {
dr_mode = "host";
};
#include "cros-ec-keyboard.dtsi" #include "cros-ec-keyboard.dtsi"

View File

@ -555,7 +555,7 @@
#size-cells = <1>; #size-cells = <1>;
ranges; ranges;
dwc3 { usbdrd_dwc3: dwc3 {
compatible = "synopsys,dwc3"; compatible = "synopsys,dwc3";
reg = <0x12000000 0x10000>; reg = <0x12000000 0x10000>;
interrupts = <0 72 0>; interrupts = <0 72 0>;

View File

@ -433,7 +433,7 @@
clocks = <&cpg_clocks R8A7740_CLK_S>, clocks = <&cpg_clocks R8A7740_CLK_S>,
<&cpg_clocks R8A7740_CLK_S>, <&sub_clk>, <&cpg_clocks R8A7740_CLK_S>, <&sub_clk>,
<&cpg_clocks R8A7740_CLK_B>, <&cpg_clocks R8A7740_CLK_B>,
<&sub_clk>, <&sub_clk>, <&cpg_clocks R8A7740_CLK_HPP>, <&sub_clk>,
<&cpg_clocks R8A7740_CLK_B>; <&cpg_clocks R8A7740_CLK_B>;
#clock-cells = <1>; #clock-cells = <1>;
renesas,clock-indices = < renesas,clock-indices = <

View File

@ -666,9 +666,9 @@
#clock-cells = <0>; #clock-cells = <0>;
clock-output-names = "sd2"; clock-output-names = "sd2";
}; };
sd3_clk: sd3_clk@e615007c { sd3_clk: sd3_clk@e615026c {
compatible = "renesas,r8a7790-div6-clock", "renesas,cpg-div6-clock"; compatible = "renesas,r8a7790-div6-clock", "renesas,cpg-div6-clock";
reg = <0 0xe615007c 0 4>; reg = <0 0xe615026c 0 4>;
clocks = <&pll1_div2_clk>; clocks = <&pll1_div2_clk>;
#clock-cells = <0>; #clock-cells = <0>;
clock-output-names = "sd3"; clock-output-names = "sd3";

View File

@ -361,6 +361,10 @@
clocks = <&ahb1_gates 6>; clocks = <&ahb1_gates 6>;
resets = <&ahb1_rst 6>; resets = <&ahb1_rst 6>;
#dma-cells = <1>; #dma-cells = <1>;
/* DMA controller requires AHB1 clocked from PLL6 */
assigned-clocks = <&ahb1_mux>;
assigned-clock-parents = <&pll6>;
}; };
mmc0: mmc@01c0f000 { mmc0: mmc@01c0f000 {

View File

@ -15,6 +15,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps65913@58"; rtc0 = "/i2c@7000d000/tps65913@58";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd;
}; };
memory { memory {

View File

@ -15,6 +15,10 @@
linux,initrd-end = <0x82800000>; linux,initrd-end = <0x82800000>;
}; };
aliases {
serial0 = &uartd;
};
firmware { firmware {
trusted-foundations { trusted-foundations {
compatible = "tlm,trusted-foundations"; compatible = "tlm,trusted-foundations";
@ -916,8 +920,6 @@
regulator-name = "vddio-sdmmc3"; regulator-name = "vddio-sdmmc3";
regulator-min-microvolt = <1800000>; regulator-min-microvolt = <1800000>;
regulator-max-microvolt = <3300000>; regulator-max-microvolt = <3300000>;
regulator-always-on;
regulator-boot-on;
}; };
ldousb { ldousb {
@ -962,7 +964,7 @@
sdhci@78000400 { sdhci@78000400 {
status = "okay"; status = "okay";
bus-width = <4>; bus-width = <4>;
vmmc-supply = <&vddio_sdmmc3>; vqmmc-supply = <&vddio_sdmmc3>;
cd-gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_LOW>; cd-gpios = <&gpio TEGRA_GPIO(V, 2) GPIO_ACTIVE_LOW>;
power-gpios = <&gpio TEGRA_GPIO(H, 0) GPIO_ACTIVE_HIGH>; power-gpios = <&gpio TEGRA_GPIO(H, 0) GPIO_ACTIVE_HIGH>;
}; };
@ -971,7 +973,6 @@
sdhci@78000600 { sdhci@78000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
vmmc-supply = <&vdd_1v8>;
non-removable; non-removable;
}; };

View File

@ -15,6 +15,10 @@
linux,initrd-end = <0x82800000>; linux,initrd-end = <0x82800000>;
}; };
aliases {
serial0 = &uartd;
};
firmware { firmware {
trusted-foundations { trusted-foundations {
compatible = "tlm,trusted-foundations"; compatible = "tlm,trusted-foundations";
@ -240,7 +244,6 @@
sdhci@78000600 { sdhci@78000600 {
status = "okay"; status = "okay";
bus-width = <8>; bus-width = <8>;
vmmc-supply = <&vdd_1v8>;
non-removable; non-removable;
}; };

View File

@ -9,13 +9,6 @@
compatible = "nvidia,tegra114"; compatible = "nvidia,tegra114";
interrupt-parent = <&gic>; interrupt-parent = <&gic>;
aliases {
serial0 = &uarta;
serial1 = &uartb;
serial2 = &uartc;
serial3 = &uartd;
};
host1x@50000000 { host1x@50000000 {
compatible = "nvidia,tegra114-host1x", "simple-bus"; compatible = "nvidia,tegra114-host1x", "simple-bus";
reg = <0x50000000 0x00028000>; reg = <0x50000000 0x00028000>;

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@0,7000d000/pmic@40"; rtc0 = "/i2c@0,7000d000/pmic@40";
rtc1 = "/rtc@0,7000e000"; rtc1 = "/rtc@0,7000e000";
serial0 = &uartd;
}; };
memory { memory {

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@0,7000d000/pmic@40"; rtc0 = "/i2c@0,7000d000/pmic@40";
rtc1 = "/rtc@0,7000e000"; rtc1 = "/rtc@0,7000e000";
serial0 = &uarta;
}; };
memory { memory {

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@0,7000d000/pmic@40"; rtc0 = "/i2c@0,7000d000/pmic@40";
rtc1 = "/rtc@0,7000e000"; rtc1 = "/rtc@0,7000e000";
serial0 = &uarta;
}; };
memory { memory {

View File

@ -286,7 +286,7 @@
* the APB DMA based serial driver, the comptible is * the APB DMA based serial driver, the comptible is
* "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart". * "nvidia,tegra124-hsuart", "nvidia,tegra30-hsuart".
*/ */
serial@0,70006000 { uarta: serial@0,70006000 {
compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006000 0x0 0x40>; reg = <0x0 0x70006000 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
@ -299,7 +299,7 @@
status = "disabled"; status = "disabled";
}; };
serial@0,70006040 { uartb: serial@0,70006040 {
compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006040 0x0 0x40>; reg = <0x0 0x70006040 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
@ -312,7 +312,7 @@
status = "disabled"; status = "disabled";
}; };
serial@0,70006200 { uartc: serial@0,70006200 {
compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006200 0x0 0x40>; reg = <0x0 0x70006200 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;
@ -325,7 +325,7 @@
status = "disabled"; status = "disabled";
}; };
serial@0,70006300 { uartd: serial@0,70006300 {
compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart"; compatible = "nvidia,tegra124-uart", "nvidia,tegra20-uart";
reg = <0x0 0x70006300 0x0 0x40>; reg = <0x0 0x70006300 0x0 0x40>;
reg-shift = <2>; reg-shift = <2>;

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd;
}; };
memory { memory {

View File

@ -6,6 +6,11 @@
model = "Toradex Colibri T20 512MB on Iris"; model = "Toradex Colibri T20 512MB on Iris";
compatible = "toradex,iris", "toradex,colibri_t20-512", "nvidia,tegra20"; compatible = "toradex,iris", "toradex,colibri_t20-512", "nvidia,tegra20";
aliases {
serial0 = &uarta;
serial1 = &uartd;
};
host1x@50000000 { host1x@50000000 {
hdmi@54280000 { hdmi@54280000 {
status = "okay"; status = "okay";

View File

@ -6,6 +6,10 @@
model = "Avionic Design Medcom-Wide board"; model = "Avionic Design Medcom-Wide board";
compatible = "ad,medcom-wide", "ad,tamonten", "nvidia,tegra20"; compatible = "ad,medcom-wide", "ad,tamonten", "nvidia,tegra20";
aliases {
serial0 = &uartd;
};
pwm@7000a000 { pwm@7000a000 {
status = "okay"; status = "okay";
}; };

View File

@ -10,6 +10,8 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uarta;
serial1 = &uartc;
}; };
memory { memory {

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd;
}; };
memory { memory {

View File

@ -7,6 +7,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd;
}; };
memory { memory {

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@7000c500/rtc@56"; rtc0 = "/i2c@7000c500/rtc@56";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uarta;
}; };
memory { memory {

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps6586x@34"; rtc0 = "/i2c@7000d000/tps6586x@34";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uartd;
}; };
memory { memory {

View File

@ -10,6 +10,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/max8907@3c"; rtc0 = "/i2c@7000d000/max8907@3c";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uarta;
}; };
memory { memory {

View File

@ -9,14 +9,6 @@
compatible = "nvidia,tegra20"; compatible = "nvidia,tegra20";
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
aliases {
serial0 = &uarta;
serial1 = &uartb;
serial2 = &uartc;
serial3 = &uartd;
serial4 = &uarte;
};
host1x@50000000 { host1x@50000000 {
compatible = "nvidia,tegra20-host1x", "simple-bus"; compatible = "nvidia,tegra20-host1x", "simple-bus";
reg = <0x50000000 0x00024000>; reg = <0x50000000 0x00024000>;

View File

@ -11,6 +11,10 @@
rtc0 = "/i2c@7000c000/rtc@68"; rtc0 = "/i2c@7000c000/rtc@68";
rtc1 = "/i2c@7000d000/tps65911@2d"; rtc1 = "/i2c@7000d000/tps65911@2d";
rtc2 = "/rtc@7000e000"; rtc2 = "/rtc@7000e000";
serial0 = &uarta;
serial1 = &uartb;
serial2 = &uartc;
serial3 = &uartd;
}; };
pcie-controller@00003000 { pcie-controller@00003000 {

View File

@ -9,6 +9,7 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps65911@2d"; rtc0 = "/i2c@7000d000/tps65911@2d";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uarta;
}; };
memory { memory {

View File

@ -30,6 +30,8 @@
aliases { aliases {
rtc0 = "/i2c@7000d000/tps65911@2d"; rtc0 = "/i2c@7000d000/tps65911@2d";
rtc1 = "/rtc@7000e000"; rtc1 = "/rtc@7000e000";
serial0 = &uarta;
serial1 = &uartc;
}; };
memory { memory {

View File

@ -10,6 +10,9 @@
rtc0 = "/i2c@7000c000/rtc@68"; rtc0 = "/i2c@7000c000/rtc@68";
rtc1 = "/i2c@7000d000/tps65911@2d"; rtc1 = "/i2c@7000d000/tps65911@2d";
rtc2 = "/rtc@7000e000"; rtc2 = "/rtc@7000e000";
serial0 = &uarta;
serial1 = &uartb;
serial2 = &uartd;
}; };
host1x@50000000 { host1x@50000000 {

View File

@ -9,14 +9,6 @@
compatible = "nvidia,tegra30"; compatible = "nvidia,tegra30";
interrupt-parent = <&intc>; interrupt-parent = <&intc>;
aliases {
serial0 = &uarta;
serial1 = &uartb;
serial2 = &uartc;
serial3 = &uartd;
serial4 = &uarte;
};
pcie-controller@00003000 { pcie-controller@00003000 {
compatible = "nvidia,tegra30-pcie"; compatible = "nvidia,tegra30-pcie";
device_type = "pci"; device_type = "pci";

View File

@ -142,11 +142,13 @@ CONFIG_MMC_DW_IDMAC=y
CONFIG_MMC_DW_EXYNOS=y CONFIG_MMC_DW_EXYNOS=y
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_MAX77686=y CONFIG_RTC_DRV_MAX77686=y
CONFIG_RTC_DRV_MAX77802=y
CONFIG_RTC_DRV_S5M=y CONFIG_RTC_DRV_S5M=y
CONFIG_RTC_DRV_S3C=y CONFIG_RTC_DRV_S3C=y
CONFIG_DMADEVICES=y CONFIG_DMADEVICES=y
CONFIG_PL330_DMA=y CONFIG_PL330_DMA=y
CONFIG_COMMON_CLK_MAX77686=y CONFIG_COMMON_CLK_MAX77686=y
CONFIG_COMMON_CLK_MAX77802=y
CONFIG_COMMON_CLK_S2MPS11=y CONFIG_COMMON_CLK_S2MPS11=y
CONFIG_EXYNOS_IOMMU=y CONFIG_EXYNOS_IOMMU=y
CONFIG_IIO=y CONFIG_IIO=y

View File

@ -217,6 +217,7 @@ CONFIG_I2C_CADENCE=y
CONFIG_I2C_DESIGNWARE_PLATFORM=y CONFIG_I2C_DESIGNWARE_PLATFORM=y
CONFIG_I2C_EXYNOS5=y CONFIG_I2C_EXYNOS5=y
CONFIG_I2C_MV64XXX=y CONFIG_I2C_MV64XXX=y
CONFIG_I2C_S3C2410=y
CONFIG_I2C_SIRF=y CONFIG_I2C_SIRF=y
CONFIG_I2C_TEGRA=y CONFIG_I2C_TEGRA=y
CONFIG_I2C_ST=y CONFIG_I2C_ST=y

View File

@ -44,16 +44,6 @@ struct cpu_context_save {
__u32 extra[2]; /* Xscale 'acc' register, etc */ __u32 extra[2]; /* Xscale 'acc' register, etc */
}; };
struct arm_restart_block {
union {
/* For user cache flushing */
struct {
unsigned long start;
unsigned long end;
} cache;
};
};
/* /*
* low level task data that entry.S needs immediate access to. * low level task data that entry.S needs immediate access to.
* __switch_to() assumes cpu_context follows immediately after cpu_domain. * __switch_to() assumes cpu_context follows immediately after cpu_domain.
@ -79,7 +69,6 @@ struct thread_info {
unsigned long thumbee_state; /* ThumbEE Handler Base register */ unsigned long thumbee_state; /* ThumbEE Handler Base register */
#endif #endif
struct restart_block restart_block; struct restart_block restart_block;
struct arm_restart_block arm_restart_block;
}; };
#define INIT_THREAD_INFO(tsk) \ #define INIT_THREAD_INFO(tsk) \

View File

@ -533,8 +533,6 @@ static int bad_syscall(int n, struct pt_regs *regs)
return regs->ARM_r0; return regs->ARM_r0;
} }
static long do_cache_op_restart(struct restart_block *);
static inline int static inline int
__do_cache_op(unsigned long start, unsigned long end) __do_cache_op(unsigned long start, unsigned long end)
{ {
@ -543,24 +541,8 @@ __do_cache_op(unsigned long start, unsigned long end)
do { do {
unsigned long chunk = min(PAGE_SIZE, end - start); unsigned long chunk = min(PAGE_SIZE, end - start);
if (signal_pending(current)) { if (fatal_signal_pending(current))
struct thread_info *ti = current_thread_info(); return 0;
ti->restart_block = (struct restart_block) {
.fn = do_cache_op_restart,
};
ti->arm_restart_block = (struct arm_restart_block) {
{
.cache = {
.start = start,
.end = end,
},
},
};
return -ERESTART_RESTARTBLOCK;
}
ret = flush_cache_user_range(start, start + chunk); ret = flush_cache_user_range(start, start + chunk);
if (ret) if (ret)
@ -573,15 +555,6 @@ __do_cache_op(unsigned long start, unsigned long end)
return 0; return 0;
} }
static long do_cache_op_restart(struct restart_block *unused)
{
struct arm_restart_block *restart_block;
restart_block = &current_thread_info()->arm_restart_block;
return __do_cache_op(restart_block->cache.start,
restart_block->cache.end);
}
static inline int static inline int
do_cache_op(unsigned long start, unsigned long end, int flags) do_cache_op(unsigned long start, unsigned long end, int flags)
{ {

View File

@ -197,7 +197,8 @@ static void unmap_range(struct kvm *kvm, pgd_t *pgdp,
pgd = pgdp + pgd_index(addr); pgd = pgdp + pgd_index(addr);
do { do {
next = kvm_pgd_addr_end(addr, end); next = kvm_pgd_addr_end(addr, end);
unmap_puds(kvm, pgd, addr, next); if (!pgd_none(*pgd))
unmap_puds(kvm, pgd, addr, next);
} while (pgd++, addr = next, addr != end); } while (pgd++, addr = next, addr != end);
} }
@ -834,6 +835,11 @@ static bool kvm_is_write_fault(struct kvm_vcpu *vcpu)
return kvm_vcpu_dabt_iswrite(vcpu); return kvm_vcpu_dabt_iswrite(vcpu);
} }
static bool kvm_is_device_pfn(unsigned long pfn)
{
return !pfn_valid(pfn);
}
static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
struct kvm_memory_slot *memslot, unsigned long hva, struct kvm_memory_slot *memslot, unsigned long hva,
unsigned long fault_status) unsigned long fault_status)
@ -904,7 +910,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa,
if (is_error_pfn(pfn)) if (is_error_pfn(pfn))
return -EFAULT; return -EFAULT;
if (kvm_is_mmio_pfn(pfn)) if (kvm_is_device_pfn(pfn))
mem_type = PAGE_S2_DEVICE; mem_type = PAGE_S2_DEVICE;
spin_lock(&kvm->mmu_lock); spin_lock(&kvm->mmu_lock);

View File

@ -400,6 +400,8 @@ int __init coherency_init(void)
type == COHERENCY_FABRIC_TYPE_ARMADA_380) type == COHERENCY_FABRIC_TYPE_ARMADA_380)
armada_375_380_coherency_init(np); armada_375_380_coherency_init(np);
of_node_put(np);
return 0; return 0;
} }

View File

@ -455,7 +455,7 @@ enum {
MSTP128, MSTP127, MSTP125, MSTP128, MSTP127, MSTP125,
MSTP116, MSTP111, MSTP100, MSTP117, MSTP116, MSTP111, MSTP100, MSTP117,
MSTP230, MSTP230, MSTP229,
MSTP222, MSTP222,
MSTP218, MSTP217, MSTP216, MSTP214, MSTP218, MSTP217, MSTP216, MSTP214,
MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200, MSTP207, MSTP206, MSTP204, MSTP203, MSTP202, MSTP201, MSTP200,
@ -474,11 +474,12 @@ static struct clk mstp_clks[MSTP_NR] = {
[MSTP127] = SH_CLK_MSTP32(&div4_clks[DIV4_S], SMSTPCR1, 27, 0), /* CEU20 */ [MSTP127] = SH_CLK_MSTP32(&div4_clks[DIV4_S], SMSTPCR1, 27, 0), /* CEU20 */
[MSTP125] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */ [MSTP125] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 25, 0), /* TMU0 */
[MSTP117] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 17, 0), /* LCDC1 */ [MSTP117] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 17, 0), /* LCDC1 */
[MSTP116] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 16, 0), /* IIC0 */ [MSTP116] = SH_CLK_MSTP32(&div4_clks[DIV4_HPP], SMSTPCR1, 16, 0), /* IIC0 */
[MSTP111] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 11, 0), /* TMU1 */ [MSTP111] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR1, 11, 0), /* TMU1 */
[MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */ [MSTP100] = SH_CLK_MSTP32(&div4_clks[DIV4_B], SMSTPCR1, 0, 0), /* LCDC0 */
[MSTP230] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 30, 0), /* SCIFA6 */ [MSTP230] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 30, 0), /* SCIFA6 */
[MSTP229] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 29, 0), /* INTCA */
[MSTP222] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 22, 0), /* SCIFA7 */ [MSTP222] = SH_CLK_MSTP32(&div6_clks[DIV6_SUB], SMSTPCR2, 22, 0), /* SCIFA7 */
[MSTP218] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* DMAC1 */ [MSTP218] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 18, 0), /* DMAC1 */
[MSTP217] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 17, 0), /* DMAC2 */ [MSTP217] = SH_CLK_MSTP32(&div4_clks[DIV4_HP], SMSTPCR2, 17, 0), /* DMAC2 */
@ -575,6 +576,10 @@ static struct clk_lookup lookups[] = {
CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]), CLKDEV_DEV_ID("sh-dma-engine.0", &mstp_clks[MSTP218]),
CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP222]), CLKDEV_DEV_ID("sh-sci.7", &mstp_clks[MSTP222]),
CLKDEV_DEV_ID("e6cd0000.serial", &mstp_clks[MSTP222]), CLKDEV_DEV_ID("e6cd0000.serial", &mstp_clks[MSTP222]),
CLKDEV_DEV_ID("renesas_intc_irqpin.0", &mstp_clks[MSTP229]),
CLKDEV_DEV_ID("renesas_intc_irqpin.1", &mstp_clks[MSTP229]),
CLKDEV_DEV_ID("renesas_intc_irqpin.2", &mstp_clks[MSTP229]),
CLKDEV_DEV_ID("renesas_intc_irqpin.3", &mstp_clks[MSTP229]),
CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP230]), CLKDEV_DEV_ID("sh-sci.6", &mstp_clks[MSTP230]),
CLKDEV_DEV_ID("e6cc0000.serial", &mstp_clks[MSTP230]), CLKDEV_DEV_ID("e6cc0000.serial", &mstp_clks[MSTP230]),

View File

@ -68,7 +68,7 @@
#define SDCKCR 0xE6150074 #define SDCKCR 0xE6150074
#define SD2CKCR 0xE6150078 #define SD2CKCR 0xE6150078
#define SD3CKCR 0xE615007C #define SD3CKCR 0xE615026C
#define MMC0CKCR 0xE6150240 #define MMC0CKCR 0xE6150240
#define MMC1CKCR 0xE6150244 #define MMC1CKCR 0xE6150244
#define SSPCKCR 0xE6150248 #define SSPCKCR 0xE6150248

View File

@ -26,6 +26,7 @@
#include <linux/of_platform.h> #include <linux/of_platform.h>
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/input.h> #include <linux/input.h>
#include <linux/i2c/i2c-sh_mobile.h>
#include <linux/io.h> #include <linux/io.h>
#include <linux/serial_sci.h> #include <linux/serial_sci.h>
#include <linux/sh_dma.h> #include <linux/sh_dma.h>
@ -192,11 +193,18 @@ static struct resource i2c4_resources[] = {
}, },
}; };
static struct i2c_sh_mobile_platform_data i2c_platform_data = {
.clks_per_count = 2,
};
static struct platform_device i2c0_device = { static struct platform_device i2c0_device = {
.name = "i2c-sh_mobile", .name = "i2c-sh_mobile",
.id = 0, .id = 0,
.resource = i2c0_resources, .resource = i2c0_resources,
.num_resources = ARRAY_SIZE(i2c0_resources), .num_resources = ARRAY_SIZE(i2c0_resources),
.dev = {
.platform_data = &i2c_platform_data,
},
}; };
static struct platform_device i2c1_device = { static struct platform_device i2c1_device = {
@ -204,6 +212,9 @@ static struct platform_device i2c1_device = {
.id = 1, .id = 1,
.resource = i2c1_resources, .resource = i2c1_resources,
.num_resources = ARRAY_SIZE(i2c1_resources), .num_resources = ARRAY_SIZE(i2c1_resources),
.dev = {
.platform_data = &i2c_platform_data,
},
}; };
static struct platform_device i2c2_device = { static struct platform_device i2c2_device = {
@ -211,6 +222,9 @@ static struct platform_device i2c2_device = {
.id = 2, .id = 2,
.resource = i2c2_resources, .resource = i2c2_resources,
.num_resources = ARRAY_SIZE(i2c2_resources), .num_resources = ARRAY_SIZE(i2c2_resources),
.dev = {
.platform_data = &i2c_platform_data,
},
}; };
static struct platform_device i2c3_device = { static struct platform_device i2c3_device = {
@ -218,6 +232,9 @@ static struct platform_device i2c3_device = {
.id = 3, .id = 3,
.resource = i2c3_resources, .resource = i2c3_resources,
.num_resources = ARRAY_SIZE(i2c3_resources), .num_resources = ARRAY_SIZE(i2c3_resources),
.dev = {
.platform_data = &i2c_platform_data,
},
}; };
static struct platform_device i2c4_device = { static struct platform_device i2c4_device = {
@ -225,6 +242,9 @@ static struct platform_device i2c4_device = {
.id = 4, .id = 4,
.resource = i2c4_resources, .resource = i2c4_resources,
.num_resources = ARRAY_SIZE(i2c4_resources), .num_resources = ARRAY_SIZE(i2c4_resources),
.dev = {
.platform_data = &i2c_platform_data,
},
}; };
static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = { static const struct sh_dmae_slave_config sh73a0_dmae_slaves[] = {

View File

@ -99,42 +99,42 @@ static inline void tegra_irq_write_mask(unsigned int irq, unsigned long reg)
static void tegra_mask(struct irq_data *d) static void tegra_mask(struct irq_data *d)
{ {
if (d->irq < FIRST_LEGACY_IRQ) if (d->hwirq < FIRST_LEGACY_IRQ)
return; return;
tegra_irq_write_mask(d->irq, ICTLR_CPU_IER_CLR); tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IER_CLR);
} }
static void tegra_unmask(struct irq_data *d) static void tegra_unmask(struct irq_data *d)
{ {
if (d->irq < FIRST_LEGACY_IRQ) if (d->hwirq < FIRST_LEGACY_IRQ)
return; return;
tegra_irq_write_mask(d->irq, ICTLR_CPU_IER_SET); tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IER_SET);
} }
static void tegra_ack(struct irq_data *d) static void tegra_ack(struct irq_data *d)
{ {
if (d->irq < FIRST_LEGACY_IRQ) if (d->hwirq < FIRST_LEGACY_IRQ)
return; return;
tegra_irq_write_mask(d->irq, ICTLR_CPU_IEP_FIR_CLR); tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IEP_FIR_CLR);
} }
static void tegra_eoi(struct irq_data *d) static void tegra_eoi(struct irq_data *d)
{ {
if (d->irq < FIRST_LEGACY_IRQ) if (d->hwirq < FIRST_LEGACY_IRQ)
return; return;
tegra_irq_write_mask(d->irq, ICTLR_CPU_IEP_FIR_CLR); tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IEP_FIR_CLR);
} }
static int tegra_retrigger(struct irq_data *d) static int tegra_retrigger(struct irq_data *d)
{ {
if (d->irq < FIRST_LEGACY_IRQ) if (d->hwirq < FIRST_LEGACY_IRQ)
return 0; return 0;
tegra_irq_write_mask(d->irq, ICTLR_CPU_IEP_FIR_SET); tegra_irq_write_mask(d->hwirq, ICTLR_CPU_IEP_FIR_SET);
return 1; return 1;
} }
@ -142,7 +142,7 @@ static int tegra_retrigger(struct irq_data *d)
#ifdef CONFIG_PM_SLEEP #ifdef CONFIG_PM_SLEEP
static int tegra_set_wake(struct irq_data *d, unsigned int enable) static int tegra_set_wake(struct irq_data *d, unsigned int enable)
{ {
u32 irq = d->irq; u32 irq = d->hwirq;
u32 index, mask; u32 index, mask;
if (irq < FIRST_LEGACY_IRQ || if (irq < FIRST_LEGACY_IRQ ||

View File

@ -270,7 +270,6 @@ __v7_pj4b_setup:
/* Auxiliary Debug Modes Control 1 Register */ /* Auxiliary Debug Modes Control 1 Register */
#define PJ4B_STATIC_BP (1 << 2) /* Enable Static BP */ #define PJ4B_STATIC_BP (1 << 2) /* Enable Static BP */
#define PJ4B_INTER_PARITY (1 << 8) /* Disable Internal Parity Handling */ #define PJ4B_INTER_PARITY (1 << 8) /* Disable Internal Parity Handling */
#define PJ4B_BCK_OFF_STREX (1 << 5) /* Enable the back off of STREX instr */
#define PJ4B_CLEAN_LINE (1 << 16) /* Disable data transfer for clean line */ #define PJ4B_CLEAN_LINE (1 << 16) /* Disable data transfer for clean line */
/* Auxiliary Debug Modes Control 2 Register */ /* Auxiliary Debug Modes Control 2 Register */
@ -293,7 +292,6 @@ __v7_pj4b_setup:
/* Auxiliary Debug Modes Control 1 Register */ /* Auxiliary Debug Modes Control 1 Register */
mrc p15, 1, r0, c15, c1, 1 mrc p15, 1, r0, c15, c1, 1
orr r0, r0, #PJ4B_CLEAN_LINE orr r0, r0, #PJ4B_CLEAN_LINE
orr r0, r0, #PJ4B_BCK_OFF_STREX
orr r0, r0, #PJ4B_INTER_PARITY orr r0, r0, #PJ4B_INTER_PARITY
bic r0, r0, #PJ4B_STATIC_BP bic r0, r0, #PJ4B_STATIC_BP
mcr p15, 1, r0, c15, c1, 1 mcr p15, 1, r0, c15, c1, 1

View File

@ -535,7 +535,7 @@ ENTRY(cpu_xscale_do_suspend)
mrc p15, 0, r5, c15, c1, 0 @ CP access reg mrc p15, 0, r5, c15, c1, 0 @ CP access reg
mrc p15, 0, r6, c13, c0, 0 @ PID mrc p15, 0, r6, c13, c0, 0 @ PID
mrc p15, 0, r7, c3, c0, 0 @ domain ID mrc p15, 0, r7, c3, c0, 0 @ domain ID
mrc p15, 0, r8, c1, c1, 0 @ auxiliary control reg mrc p15, 0, r8, c1, c0, 1 @ auxiliary control reg
mrc p15, 0, r9, c1, c0, 0 @ control reg mrc p15, 0, r9, c1, c0, 0 @ control reg
bic r4, r4, #2 @ clear frequency change bit bic r4, r4, #2 @ clear frequency change bit
stmia r0, {r4 - r9} @ store cp regs stmia r0, {r4 - r9} @ store cp regs
@ -552,7 +552,7 @@ ENTRY(cpu_xscale_do_resume)
mcr p15, 0, r6, c13, c0, 0 @ PID mcr p15, 0, r6, c13, c0, 0 @ PID
mcr p15, 0, r7, c3, c0, 0 @ domain ID mcr p15, 0, r7, c3, c0, 0 @ domain ID
mcr p15, 0, r1, c2, c0, 0 @ translation table base addr mcr p15, 0, r1, c2, c0, 0 @ translation table base addr
mcr p15, 0, r8, c1, c1, 0 @ auxiliary control reg mcr p15, 0, r8, c1, c0, 1 @ auxiliary control reg
mov r0, r9 @ control register mov r0, r9 @ control register
b cpu_resume_mmu b cpu_resume_mmu
ENDPROC(cpu_xscale_do_resume) ENDPROC(cpu_xscale_do_resume)

View File

@ -424,6 +424,11 @@ static const struct sys_reg_desc sys_reg_descs[] = {
/* VBAR_EL1 */ /* VBAR_EL1 */
{ Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b0000), Op2(0b000), { Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b0000), Op2(0b000),
NULL, reset_val, VBAR_EL1, 0 }, NULL, reset_val, VBAR_EL1, 0 },
/* ICC_SRE_EL1 */
{ Op0(0b11), Op1(0b000), CRn(0b1100), CRm(0b1100), Op2(0b101),
trap_raz_wi },
/* CONTEXTIDR_EL1 */ /* CONTEXTIDR_EL1 */
{ Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b001), { Op0(0b11), Op1(0b000), CRn(0b1101), CRm(0b0000), Op2(0b001),
access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 }, access_vm_reg, reset_val, CONTEXTIDR_EL1, 0 },
@ -690,6 +695,10 @@ static const struct sys_reg_desc cp15_regs[] = {
{ Op1( 0), CRn(10), CRm( 2), Op2( 1), access_vm_reg, NULL, c10_NMRR }, { Op1( 0), CRn(10), CRm( 2), Op2( 1), access_vm_reg, NULL, c10_NMRR },
{ Op1( 0), CRn(10), CRm( 3), Op2( 0), access_vm_reg, NULL, c10_AMAIR0 }, { Op1( 0), CRn(10), CRm( 3), Op2( 0), access_vm_reg, NULL, c10_AMAIR0 },
{ Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 }, { Op1( 0), CRn(10), CRm( 3), Op2( 1), access_vm_reg, NULL, c10_AMAIR1 },
/* ICC_SRE */
{ Op1( 0), CRn(12), CRm(12), Op2( 5), trap_raz_wi },
{ Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID }, { Op1( 0), CRn(13), CRm( 0), Op2( 1), access_vm_reg, NULL, c13_CID },
}; };

View File

@ -1563,7 +1563,7 @@ int kvm_arch_prepare_memory_region(struct kvm *kvm,
for (i = 0; i < npages; i++) { for (i = 0; i < npages; i++) {
pfn = gfn_to_pfn(kvm, base_gfn + i); pfn = gfn_to_pfn(kvm, base_gfn + i);
if (!kvm_is_mmio_pfn(pfn)) { if (!kvm_is_reserved_pfn(pfn)) {
kvm_set_pmt_entry(kvm, base_gfn + i, kvm_set_pmt_entry(kvm, base_gfn + i,
pfn << PAGE_SHIFT, pfn << PAGE_SHIFT,
_PAGE_AR_RWX | _PAGE_MA_WB); _PAGE_AR_RWX | _PAGE_MA_WB);

View File

@ -2101,9 +2101,17 @@ config 64BIT_PHYS_ADDR
config ARCH_PHYS_ADDR_T_64BIT config ARCH_PHYS_ADDR_T_64BIT
def_bool 64BIT_PHYS_ADDR def_bool 64BIT_PHYS_ADDR
choice
prompt "SmartMIPS or microMIPS ASE support"
config CPU_NEEDS_NO_SMARTMIPS_OR_MICROMIPS
bool "None"
help
Select this if you want neither microMIPS nor SmartMIPS support
config CPU_HAS_SMARTMIPS config CPU_HAS_SMARTMIPS
depends on SYS_SUPPORTS_SMARTMIPS depends on SYS_SUPPORTS_SMARTMIPS
bool "Support for the SmartMIPS ASE" bool "SmartMIPS"
help help
SmartMIPS is a extension of the MIPS32 architecture aimed at SmartMIPS is a extension of the MIPS32 architecture aimed at
increased security at both hardware and software level for increased security at both hardware and software level for
@ -2115,11 +2123,13 @@ config CPU_HAS_SMARTMIPS
config CPU_MICROMIPS config CPU_MICROMIPS
depends on SYS_SUPPORTS_MICROMIPS depends on SYS_SUPPORTS_MICROMIPS
bool "Build kernel using microMIPS ISA" bool "microMIPS"
help help
When this option is enabled the kernel will be built using the When this option is enabled the kernel will be built using the
microMIPS ISA microMIPS ISA
endchoice
config CPU_HAS_MSA config CPU_HAS_MSA
bool "Support for the MIPS SIMD Architecture (EXPERIMENTAL)" bool "Support for the MIPS SIMD Architecture (EXPERIMENTAL)"
depends on CPU_SUPPORTS_MSA depends on CPU_SUPPORTS_MSA

View File

@ -661,6 +661,8 @@
#define MIPS_CONF6_SYND (_ULCAST_(1) << 13) #define MIPS_CONF6_SYND (_ULCAST_(1) << 13)
/* proAptiv FTLB on/off bit */ /* proAptiv FTLB on/off bit */
#define MIPS_CONF6_FTLBEN (_ULCAST_(1) << 15) #define MIPS_CONF6_FTLBEN (_ULCAST_(1) << 15)
/* FTLB probability bits */
#define MIPS_CONF6_FTLBP_SHIFT (16)
#define MIPS_CONF7_WII (_ULCAST_(1) << 31) #define MIPS_CONF7_WII (_ULCAST_(1) << 31)

View File

@ -257,7 +257,11 @@ static inline void protected_flush_icache_line(unsigned long addr)
*/ */
static inline void protected_writeback_dcache_line(unsigned long addr) static inline void protected_writeback_dcache_line(unsigned long addr)
{ {
#ifdef CONFIG_EVA
protected_cachee_op(Hit_Writeback_Inv_D, addr);
#else
protected_cache_op(Hit_Writeback_Inv_D, addr); protected_cache_op(Hit_Writeback_Inv_D, addr);
#endif
} }
static inline void protected_writeback_scache_line(unsigned long addr) static inline void protected_writeback_scache_line(unsigned long addr)

View File

@ -1422,7 +1422,7 @@ static inline long __strnlen_user(const char __user *s, long n)
} }
/* /*
* strlen_user: - Get the size of a string in user space. * strnlen_user: - Get the size of a string in user space.
* @str: The string to measure. * @str: The string to measure.
* *
* Context: User context only. This function may sleep. * Context: User context only. This function may sleep.
@ -1431,9 +1431,7 @@ static inline long __strnlen_user(const char __user *s, long n)
* *
* Returns the size of the string INCLUDING the terminating NUL. * Returns the size of the string INCLUDING the terminating NUL.
* On exception, returns 0. * On exception, returns 0.
* * If the string is too long, returns a value greater than @n.
* If there is a limit on the length of a valid string, you may wish to
* consider using strnlen_user() instead.
*/ */
static inline long strnlen_user(const char __user *s, long n) static inline long strnlen_user(const char __user *s, long n)
{ {

View File

@ -1045,7 +1045,7 @@
#define __NR_seccomp (__NR_Linux + 316) #define __NR_seccomp (__NR_Linux + 316)
#define __NR_getrandom (__NR_Linux + 317) #define __NR_getrandom (__NR_Linux + 317)
#define __NR_memfd_create (__NR_Linux + 318) #define __NR_memfd_create (__NR_Linux + 318)
#define __NR_memfd_create (__NR_Linux + 319) #define __NR_bpf (__NR_Linux + 319)
/* /*
* Offset of the last N32 flavoured syscall * Offset of the last N32 flavoured syscall

View File

@ -208,7 +208,6 @@ bmips_reset_nmi_vec_end:
END(bmips_reset_nmi_vec) END(bmips_reset_nmi_vec)
.set pop .set pop
.previous
/*********************************************************************** /***********************************************************************
* CPU1 warm restart vector (used for second and subsequent boots). * CPU1 warm restart vector (used for second and subsequent boots).
@ -281,5 +280,3 @@ LEAF(bmips_enable_xks01)
jr ra jr ra
END(bmips_enable_xks01) END(bmips_enable_xks01)
.previous

View File

@ -229,6 +229,7 @@ LEAF(mips_cps_core_init)
nop nop
.set push .set push
.set mips32r2
.set mt .set mt
/* Only allow 1 TC per VPE to execute... */ /* Only allow 1 TC per VPE to execute... */
@ -345,6 +346,7 @@ LEAF(mips_cps_boot_vpes)
nop nop
.set push .set push
.set mips32r2
.set mt .set mt
1: /* Enter VPE configuration state */ 1: /* Enter VPE configuration state */

View File

@ -193,6 +193,32 @@ static void set_isa(struct cpuinfo_mips *c, unsigned int isa)
static char unknown_isa[] = KERN_ERR \ static char unknown_isa[] = KERN_ERR \
"Unsupported ISA type, c0.config0: %d."; "Unsupported ISA type, c0.config0: %d.";
static unsigned int calculate_ftlb_probability(struct cpuinfo_mips *c)
{
unsigned int probability = c->tlbsize / c->tlbsizevtlb;
/*
* 0 = All TLBWR instructions go to FTLB
* 1 = 15:1: For every 16 TBLWR instructions, 15 go to the
* FTLB and 1 goes to the VTLB.
* 2 = 7:1: As above with 7:1 ratio.
* 3 = 3:1: As above with 3:1 ratio.
*
* Use the linear midpoint as the probability threshold.
*/
if (probability >= 12)
return 1;
else if (probability >= 6)
return 2;
else
/*
* So FTLB is less than 4 times bigger than VTLB.
* A 3:1 ratio can still be useful though.
*/
return 3;
}
static void set_ftlb_enable(struct cpuinfo_mips *c, int enable) static void set_ftlb_enable(struct cpuinfo_mips *c, int enable)
{ {
unsigned int config6; unsigned int config6;
@ -203,9 +229,14 @@ static void set_ftlb_enable(struct cpuinfo_mips *c, int enable)
case CPU_P5600: case CPU_P5600:
/* proAptiv & related cores use Config6 to enable the FTLB */ /* proAptiv & related cores use Config6 to enable the FTLB */
config6 = read_c0_config6(); config6 = read_c0_config6();
/* Clear the old probability value */
config6 &= ~(3 << MIPS_CONF6_FTLBP_SHIFT);
if (enable) if (enable)
/* Enable FTLB */ /* Enable FTLB */
write_c0_config6(config6 | MIPS_CONF6_FTLBEN); write_c0_config6(config6 |
(calculate_ftlb_probability(c)
<< MIPS_CONF6_FTLBP_SHIFT)
| MIPS_CONF6_FTLBEN);
else else
/* Disable FTLB */ /* Disable FTLB */
write_c0_config6(config6 & ~MIPS_CONF6_FTLBEN); write_c0_config6(config6 & ~MIPS_CONF6_FTLBEN);

View File

@ -94,12 +94,12 @@ int rtlx_open(int index, int can_sleep)
int ret = 0; int ret = 0;
if (index >= RTLX_CHANNELS) { if (index >= RTLX_CHANNELS) {
pr_debug(KERN_DEBUG "rtlx_open index out of range\n"); pr_debug("rtlx_open index out of range\n");
return -ENOSYS; return -ENOSYS;
} }
if (atomic_inc_return(&channel_wqs[index].in_open) > 1) { if (atomic_inc_return(&channel_wqs[index].in_open) > 1) {
pr_debug(KERN_DEBUG "rtlx_open channel %d already opened\n", index); pr_debug("rtlx_open channel %d already opened\n", index);
ret = -EBUSY; ret = -EBUSY;
goto out_fail; goto out_fail;
} }

View File

@ -485,7 +485,7 @@ static void __init bootmem_init(void)
* NOTE: historically plat_mem_setup did the entire platform initialization. * NOTE: historically plat_mem_setup did the entire platform initialization.
* This was rather impractical because it meant plat_mem_setup had to * This was rather impractical because it meant plat_mem_setup had to
* get away without any kind of memory allocator. To keep old code from * get away without any kind of memory allocator. To keep old code from
* breaking plat_setup was just renamed to plat_setup and a second platform * breaking plat_setup was just renamed to plat_mem_setup and a second platform
* initialization hook for anything else was introduced. * initialization hook for anything else was introduced.
*/ */
@ -493,7 +493,7 @@ static int usermem __initdata;
static int __init early_parse_mem(char *p) static int __init early_parse_mem(char *p)
{ {
unsigned long start, size; phys_t start, size;
/* /*
* If a user specifies memory size, we * If a user specifies memory size, we

View File

@ -658,13 +658,13 @@ static int signal_setup(void)
save_fp_context = _save_fp_context; save_fp_context = _save_fp_context;
restore_fp_context = _restore_fp_context; restore_fp_context = _restore_fp_context;
} else { } else {
save_fp_context = copy_fp_from_sigcontext; save_fp_context = copy_fp_to_sigcontext;
restore_fp_context = copy_fp_to_sigcontext; restore_fp_context = copy_fp_from_sigcontext;
} }
#endif /* CONFIG_SMP */ #endif /* CONFIG_SMP */
#else #else
save_fp_context = copy_fp_from_sigcontext;; save_fp_context = copy_fp_to_sigcontext;
restore_fp_context = copy_fp_to_sigcontext; restore_fp_context = copy_fp_from_sigcontext;
#endif #endif
return 0; return 0;

View File

@ -11,7 +11,8 @@ obj-$(CONFIG_PCI) += pci.o
# Serial port support # Serial port support
# #
obj-$(CONFIG_EARLY_PRINTK) += early_printk.o obj-$(CONFIG_EARLY_PRINTK) += early_printk.o
obj-$(CONFIG_SERIAL_8250) += serial.o loongson-serial-$(CONFIG_SERIAL_8250) := serial.o
obj-y += $(loongson-serial-m) $(loongson-serial-y)
obj-$(CONFIG_LOONGSON_UART_BASE) += uart_base.o obj-$(CONFIG_LOONGSON_UART_BASE) += uart_base.o
obj-$(CONFIG_LOONGSON_MC146818) += rtc.o obj-$(CONFIG_LOONGSON_MC146818) += rtc.o

View File

@ -1872,8 +1872,16 @@ build_r4000_tlbchange_handler_head(u32 **p, struct uasm_label **l,
uasm_l_smp_pgtable_change(l, *p); uasm_l_smp_pgtable_change(l, *p);
#endif #endif
iPTE_LW(p, wr.r1, wr.r2); /* get even pte */ iPTE_LW(p, wr.r1, wr.r2); /* get even pte */
if (!m4kc_tlbp_war()) if (!m4kc_tlbp_war()) {
build_tlb_probe_entry(p); build_tlb_probe_entry(p);
if (cpu_has_htw) {
/* race condition happens, leaving */
uasm_i_ehb(p);
uasm_i_mfc0(p, wr.r3, C0_INDEX);
uasm_il_bltz(p, r, wr.r3, label_leave);
uasm_i_nop(p);
}
}
return wr; return wr;
} }

View File

@ -5,7 +5,7 @@
* *
* Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved. * Copyright (C) 2012 MIPS Technologies, Inc. All rights reserved.
*/ */
#include <linux/module.h> #include <linux/init.h>
#include <linux/leds.h> #include <linux/leds.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
@ -76,8 +76,4 @@ static int __init led_init(void)
return platform_device_register(&fled_device); return platform_device_register(&fled_device);
} }
module_init(led_init); device_initcall(led_init);
MODULE_AUTHOR("Chris Dearman <chris@mips.com>");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("LED probe driver for SEAD-3");

View File

@ -1,6 +1,10 @@
obj-y += setup.o nlm_hal.o cop2-ex.o dt.o obj-y += setup.o nlm_hal.o cop2-ex.o dt.o
obj-$(CONFIG_SMP) += wakeup.o obj-$(CONFIG_SMP) += wakeup.o
obj-$(CONFIG_USB) += usb-init.o ifdef CONFIG_USB
obj-$(CONFIG_USB) += usb-init-xlp2.o obj-y += usb-init.o
obj-$(CONFIG_SATA_AHCI) += ahci-init.o obj-y += usb-init-xlp2.o
obj-$(CONFIG_SATA_AHCI) += ahci-init-xlp2.o endif
ifdef CONFIG_SATA_AHCI
obj-y += ahci-init.o
obj-y += ahci-init-xlp2.o
endif

View File

@ -159,8 +159,6 @@ struct pci_dn {
int pci_ext_config_space; /* for pci devices */ int pci_ext_config_space; /* for pci devices */
bool force_32bit_msi;
struct pci_dev *pcidev; /* back-pointer to the pci device */ struct pci_dev *pcidev; /* back-pointer to the pci device */
#ifdef CONFIG_EEH #ifdef CONFIG_EEH
struct eeh_dev *edev; /* eeh device */ struct eeh_dev *edev; /* eeh device */

View File

@ -65,7 +65,7 @@ static ssize_t eeh_pe_state_show(struct device *dev,
return -ENODEV; return -ENODEV;
state = eeh_ops->get_state(edev->pe, NULL); state = eeh_ops->get_state(edev->pe, NULL);
return sprintf(buf, "%0x08x %0x08x\n", return sprintf(buf, "0x%08x 0x%08x\n",
state, edev->pe->state); state, edev->pe->state);
} }

View File

@ -266,13 +266,3 @@ int pcibus_to_node(struct pci_bus *bus)
} }
EXPORT_SYMBOL(pcibus_to_node); EXPORT_SYMBOL(pcibus_to_node);
#endif #endif
static void quirk_radeon_32bit_msi(struct pci_dev *dev)
{
struct pci_dn *pdn = pci_get_pdn(dev);
if (pdn)
pdn->force_32bit_msi = true;
}
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0x68f2, quirk_radeon_32bit_msi);
DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_ATI, 0xaa68, quirk_radeon_32bit_msi);

View File

@ -30,8 +30,8 @@
V_FUNCTION_BEGIN(__kernel_getcpu) V_FUNCTION_BEGIN(__kernel_getcpu)
.cfi_startproc .cfi_startproc
mfspr r5,SPRN_SPRG_VDSO_READ mfspr r5,SPRN_SPRG_VDSO_READ
cmpdi cr0,r3,0 cmpwi cr0,r3,0
cmpdi cr1,r4,0 cmpwi cr1,r4,0
clrlwi r6,r5,16 clrlwi r6,r5,16
rlwinm r7,r5,16,31-15,31-0 rlwinm r7,r5,16,31-15,31-0
beq cr0,1f beq cr0,1f

View File

@ -57,7 +57,7 @@ static void print_hmi_event_info(struct OpalHMIEvent *hmi_evt)
}; };
/* Print things out */ /* Print things out */
if (hmi_evt->version != OpalHMIEvt_V1) { if (hmi_evt->version < OpalHMIEvt_V1) {
pr_err("HMI Interrupt, Unknown event version %d !\n", pr_err("HMI Interrupt, Unknown event version %d !\n",
hmi_evt->version); hmi_evt->version);
return; return;

View File

@ -1509,7 +1509,6 @@ static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
unsigned int is_64, struct msi_msg *msg) unsigned int is_64, struct msi_msg *msg)
{ {
struct pnv_ioda_pe *pe = pnv_ioda_get_pe(dev); struct pnv_ioda_pe *pe = pnv_ioda_get_pe(dev);
struct pci_dn *pdn = pci_get_pdn(dev);
unsigned int xive_num = hwirq - phb->msi_base; unsigned int xive_num = hwirq - phb->msi_base;
__be32 data; __be32 data;
int rc; int rc;
@ -1523,7 +1522,7 @@ static int pnv_pci_ioda_msi_setup(struct pnv_phb *phb, struct pci_dev *dev,
return -ENXIO; return -ENXIO;
/* Force 32-bit MSI on some broken devices */ /* Force 32-bit MSI on some broken devices */
if (pdn && pdn->force_32bit_msi) if (dev->no_64bit_msi)
is_64 = 0; is_64 = 0;
/* Assign XIVE to PE */ /* Assign XIVE to PE */
@ -1997,7 +1996,7 @@ static void __init pnv_pci_init_ioda_phb(struct device_node *np,
if (is_kdump_kernel()) { if (is_kdump_kernel()) {
pr_info(" Issue PHB reset ...\n"); pr_info(" Issue PHB reset ...\n");
ioda_eeh_phb_reset(hose, EEH_RESET_FUNDAMENTAL); ioda_eeh_phb_reset(hose, EEH_RESET_FUNDAMENTAL);
ioda_eeh_phb_reset(hose, OPAL_DEASSERT_RESET); ioda_eeh_phb_reset(hose, EEH_RESET_DEACTIVATE);
} }
/* Configure M64 window */ /* Configure M64 window */

View File

@ -50,7 +50,6 @@ static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
{ {
struct pci_controller *hose = pci_bus_to_host(pdev->bus); struct pci_controller *hose = pci_bus_to_host(pdev->bus);
struct pnv_phb *phb = hose->private_data; struct pnv_phb *phb = hose->private_data;
struct pci_dn *pdn = pci_get_pdn(pdev);
struct msi_desc *entry; struct msi_desc *entry;
struct msi_msg msg; struct msi_msg msg;
int hwirq; int hwirq;
@ -60,7 +59,7 @@ static int pnv_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
if (WARN_ON(!phb) || !phb->msi_bmp.bitmap) if (WARN_ON(!phb) || !phb->msi_bmp.bitmap)
return -ENODEV; return -ENODEV;
if (pdn && pdn->force_32bit_msi && !phb->msi32_support) if (pdev->no_64bit_msi && !phb->msi32_support)
return -ENODEV; return -ENODEV;
list_for_each_entry(entry, &pdev->msi_list, list) { list_for_each_entry(entry, &pdev->msi_list, list) {

View File

@ -420,7 +420,7 @@ static int rtas_setup_msi_irqs(struct pci_dev *pdev, int nvec_in, int type)
*/ */
again: again:
if (type == PCI_CAP_ID_MSI) { if (type == PCI_CAP_ID_MSI) {
if (pdn->force_32bit_msi) { if (pdev->no_64bit_msi) {
rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec); rc = rtas_change_msi(pdn, RTAS_CHANGE_32MSI_FN, nvec);
if (rc < 0) { if (rc < 0) {
/* /*

View File

@ -293,10 +293,10 @@ static inline void disable_surveillance(void)
args.token = rtas_token("set-indicator"); args.token = rtas_token("set-indicator");
if (args.token == RTAS_UNKNOWN_SERVICE) if (args.token == RTAS_UNKNOWN_SERVICE)
return; return;
args.nargs = 3; args.nargs = cpu_to_be32(3);
args.nret = 1; args.nret = cpu_to_be32(1);
args.rets = &args.args[3]; args.rets = &args.args[3];
args.args[0] = SURVEILLANCE_TOKEN; args.args[0] = cpu_to_be32(SURVEILLANCE_TOKEN);
args.args[1] = 0; args.args[1] = 0;
args.args[2] = 0; args.args[2] = 0;
enter_rtas(__pa(&args)); enter_rtas(__pa(&args));

View File

@ -12,6 +12,14 @@ int dma_supported(struct device *dev, u64 mask);
#define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f) #define dma_alloc_noncoherent(d, s, h, f) dma_alloc_coherent(d, s, h, f)
#define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h) #define dma_free_noncoherent(d, s, v, h) dma_free_coherent(d, s, v, h)
static inline void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
enum dma_data_direction dir)
{
/* Since dma_{alloc,free}_noncoherent() allocated coherent memory, this
* routine can be a nop.
*/
}
extern struct dma_map_ops *dma_ops; extern struct dma_map_ops *dma_ops;
extern struct dma_map_ops *leon_dma_ops; extern struct dma_map_ops *leon_dma_ops;
extern struct dma_map_ops pci32_dma_ops; extern struct dma_map_ops pci32_dma_ops;

View File

@ -20,7 +20,6 @@
#define THREAD_SIZE_ORDER 1 #define THREAD_SIZE_ORDER 1
#define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER) #define THREAD_SIZE (PAGE_SIZE << THREAD_SIZE_ORDER)
#define STACKFAULT_STACK 0
#define DOUBLEFAULT_STACK 1 #define DOUBLEFAULT_STACK 1
#define NMI_STACK 0 #define NMI_STACK 0
#define DEBUG_STACK 0 #define DEBUG_STACK 0

View File

@ -14,12 +14,11 @@
#define IRQ_STACK_ORDER 2 #define IRQ_STACK_ORDER 2
#define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER) #define IRQ_STACK_SIZE (PAGE_SIZE << IRQ_STACK_ORDER)
#define STACKFAULT_STACK 1 #define DOUBLEFAULT_STACK 1
#define DOUBLEFAULT_STACK 2 #define NMI_STACK 2
#define NMI_STACK 3 #define DEBUG_STACK 3
#define DEBUG_STACK 4 #define MCE_STACK 4
#define MCE_STACK 5 #define N_EXCEPTION_STACKS 4 /* hw limit: 7 */
#define N_EXCEPTION_STACKS 5 /* hw limit: 7 */
#define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT) #define PUD_PAGE_SIZE (_AC(1, UL) << PUD_SHIFT)
#define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1)) #define PUD_PAGE_MASK (~(PUD_PAGE_SIZE-1))

View File

@ -141,7 +141,7 @@ struct thread_info {
/* Only used for 64 bit */ /* Only used for 64 bit */
#define _TIF_DO_NOTIFY_MASK \ #define _TIF_DO_NOTIFY_MASK \
(_TIF_SIGPENDING | _TIF_MCE_NOTIFY | _TIF_NOTIFY_RESUME | \ (_TIF_SIGPENDING | _TIF_MCE_NOTIFY | _TIF_NOTIFY_RESUME | \
_TIF_USER_RETURN_NOTIFY) _TIF_USER_RETURN_NOTIFY | _TIF_UPROBE)
/* flags to check in __switch_to() */ /* flags to check in __switch_to() */
#define _TIF_WORK_CTXSW \ #define _TIF_WORK_CTXSW \

View File

@ -39,6 +39,7 @@ asmlinkage void simd_coprocessor_error(void);
#ifdef CONFIG_TRACING #ifdef CONFIG_TRACING
asmlinkage void trace_page_fault(void); asmlinkage void trace_page_fault(void);
#define trace_stack_segment stack_segment
#define trace_divide_error divide_error #define trace_divide_error divide_error
#define trace_bounds bounds #define trace_bounds bounds
#define trace_invalid_op invalid_op #define trace_invalid_op invalid_op

View File

@ -24,7 +24,6 @@ static char x86_stack_ids[][8] = {
[ DEBUG_STACK-1 ] = "#DB", [ DEBUG_STACK-1 ] = "#DB",
[ NMI_STACK-1 ] = "NMI", [ NMI_STACK-1 ] = "NMI",
[ DOUBLEFAULT_STACK-1 ] = "#DF", [ DOUBLEFAULT_STACK-1 ] = "#DF",
[ STACKFAULT_STACK-1 ] = "#SS",
[ MCE_STACK-1 ] = "#MC", [ MCE_STACK-1 ] = "#MC",
#if DEBUG_STKSZ > EXCEPTION_STKSZ #if DEBUG_STKSZ > EXCEPTION_STKSZ
[ N_EXCEPTION_STACKS ... [ N_EXCEPTION_STACKS ...

View File

@ -828,9 +828,15 @@ ENTRY(native_iret)
jnz native_irq_return_ldt jnz native_irq_return_ldt
#endif #endif
.global native_irq_return_iret
native_irq_return_iret: native_irq_return_iret:
/*
* This may fault. Non-paranoid faults on return to userspace are
* handled by fixup_bad_iret. These include #SS, #GP, and #NP.
* Double-faults due to espfix64 are handled in do_double_fault.
* Other faults here are fatal.
*/
iretq iretq
_ASM_EXTABLE(native_irq_return_iret, bad_iret)
#ifdef CONFIG_X86_ESPFIX64 #ifdef CONFIG_X86_ESPFIX64
native_irq_return_ldt: native_irq_return_ldt:
@ -858,25 +864,6 @@ native_irq_return_ldt:
jmp native_irq_return_iret jmp native_irq_return_iret
#endif #endif
.section .fixup,"ax"
bad_iret:
/*
* The iret traps when the %cs or %ss being restored is bogus.
* We've lost the original trap vector and error code.
* #GPF is the most likely one to get for an invalid selector.
* So pretend we completed the iret and took the #GPF in user mode.
*
* We are now running with the kernel GS after exception recovery.
* But error_entry expects us to have user GS to match the user %cs,
* so swap back.
*/
pushq $0
SWAPGS
jmp general_protection
.previous
/* edi: workmask, edx: work */ /* edi: workmask, edx: work */
retint_careful: retint_careful:
CFI_RESTORE_STATE CFI_RESTORE_STATE
@ -922,37 +909,6 @@ ENTRY(retint_kernel)
CFI_ENDPROC CFI_ENDPROC
END(common_interrupt) END(common_interrupt)
/*
* If IRET takes a fault on the espfix stack, then we
* end up promoting it to a doublefault. In that case,
* modify the stack to make it look like we just entered
* the #GP handler from user space, similar to bad_iret.
*/
#ifdef CONFIG_X86_ESPFIX64
ALIGN
__do_double_fault:
XCPT_FRAME 1 RDI+8
movq RSP(%rdi),%rax /* Trap on the espfix stack? */
sarq $PGDIR_SHIFT,%rax
cmpl $ESPFIX_PGD_ENTRY,%eax
jne do_double_fault /* No, just deliver the fault */
cmpl $__KERNEL_CS,CS(%rdi)
jne do_double_fault
movq RIP(%rdi),%rax
cmpq $native_irq_return_iret,%rax
jne do_double_fault /* This shouldn't happen... */
movq PER_CPU_VAR(kernel_stack),%rax
subq $(6*8-KERNEL_STACK_OFFSET),%rax /* Reset to original stack */
movq %rax,RSP(%rdi)
movq $0,(%rax) /* Missing (lost) #GP error code */
movq $general_protection,RIP(%rdi)
retq
CFI_ENDPROC
END(__do_double_fault)
#else
# define __do_double_fault do_double_fault
#endif
/* /*
* APIC interrupts. * APIC interrupts.
*/ */
@ -1124,7 +1080,7 @@ idtentry overflow do_overflow has_error_code=0
idtentry bounds do_bounds has_error_code=0 idtentry bounds do_bounds has_error_code=0
idtentry invalid_op do_invalid_op has_error_code=0 idtentry invalid_op do_invalid_op has_error_code=0
idtentry device_not_available do_device_not_available has_error_code=0 idtentry device_not_available do_device_not_available has_error_code=0
idtentry double_fault __do_double_fault has_error_code=1 paranoid=1 idtentry double_fault do_double_fault has_error_code=1 paranoid=1
idtentry coprocessor_segment_overrun do_coprocessor_segment_overrun has_error_code=0 idtentry coprocessor_segment_overrun do_coprocessor_segment_overrun has_error_code=0
idtentry invalid_TSS do_invalid_TSS has_error_code=1 idtentry invalid_TSS do_invalid_TSS has_error_code=1
idtentry segment_not_present do_segment_not_present has_error_code=1 idtentry segment_not_present do_segment_not_present has_error_code=1
@ -1289,7 +1245,7 @@ apicinterrupt3 HYPERVISOR_CALLBACK_VECTOR \
idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK idtentry debug do_debug has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK
idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK idtentry int3 do_int3 has_error_code=0 paranoid=1 shift_ist=DEBUG_STACK
idtentry stack_segment do_stack_segment has_error_code=1 paranoid=1 idtentry stack_segment do_stack_segment has_error_code=1
#ifdef CONFIG_XEN #ifdef CONFIG_XEN
idtentry xen_debug do_debug has_error_code=0 idtentry xen_debug do_debug has_error_code=0
idtentry xen_int3 do_int3 has_error_code=0 idtentry xen_int3 do_int3 has_error_code=0
@ -1399,17 +1355,16 @@ error_sti:
/* /*
* There are two places in the kernel that can potentially fault with * There are two places in the kernel that can potentially fault with
* usergs. Handle them here. The exception handlers after iret run with * usergs. Handle them here. B stepping K8s sometimes report a
* kernel gs again, so don't set the user space flag. B stepping K8s * truncated RIP for IRET exceptions returning to compat mode. Check
* sometimes report an truncated RIP for IRET exceptions returning to * for these here too.
* compat mode. Check for these here too.
*/ */
error_kernelspace: error_kernelspace:
CFI_REL_OFFSET rcx, RCX+8 CFI_REL_OFFSET rcx, RCX+8
incl %ebx incl %ebx
leaq native_irq_return_iret(%rip),%rcx leaq native_irq_return_iret(%rip),%rcx
cmpq %rcx,RIP+8(%rsp) cmpq %rcx,RIP+8(%rsp)
je error_swapgs je error_bad_iret
movl %ecx,%eax /* zero extend */ movl %ecx,%eax /* zero extend */
cmpq %rax,RIP+8(%rsp) cmpq %rax,RIP+8(%rsp)
je bstep_iret je bstep_iret
@ -1420,7 +1375,15 @@ error_kernelspace:
bstep_iret: bstep_iret:
/* Fix truncated RIP */ /* Fix truncated RIP */
movq %rcx,RIP+8(%rsp) movq %rcx,RIP+8(%rsp)
jmp error_swapgs /* fall through */
error_bad_iret:
SWAPGS
mov %rsp,%rdi
call fixup_bad_iret
mov %rax,%rsp
decl %ebx /* Return to usergs */
jmp error_sti
CFI_ENDPROC CFI_ENDPROC
END(error_entry) END(error_entry)

View File

@ -233,32 +233,40 @@ DO_ERROR(X86_TRAP_UD, SIGILL, "invalid opcode", invalid_op)
DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun",coprocessor_segment_overrun) DO_ERROR(X86_TRAP_OLD_MF, SIGFPE, "coprocessor segment overrun",coprocessor_segment_overrun)
DO_ERROR(X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS) DO_ERROR(X86_TRAP_TS, SIGSEGV, "invalid TSS", invalid_TSS)
DO_ERROR(X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present) DO_ERROR(X86_TRAP_NP, SIGBUS, "segment not present", segment_not_present)
#ifdef CONFIG_X86_32
DO_ERROR(X86_TRAP_SS, SIGBUS, "stack segment", stack_segment) DO_ERROR(X86_TRAP_SS, SIGBUS, "stack segment", stack_segment)
#endif
DO_ERROR(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check) DO_ERROR(X86_TRAP_AC, SIGBUS, "alignment check", alignment_check)
#ifdef CONFIG_X86_64 #ifdef CONFIG_X86_64
/* Runs on IST stack */ /* Runs on IST stack */
dotraplinkage void do_stack_segment(struct pt_regs *regs, long error_code)
{
enum ctx_state prev_state;
prev_state = exception_enter();
if (notify_die(DIE_TRAP, "stack segment", regs, error_code,
X86_TRAP_SS, SIGBUS) != NOTIFY_STOP) {
preempt_conditional_sti(regs);
do_trap(X86_TRAP_SS, SIGBUS, "stack segment", regs, error_code, NULL);
preempt_conditional_cli(regs);
}
exception_exit(prev_state);
}
dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code) dotraplinkage void do_double_fault(struct pt_regs *regs, long error_code)
{ {
static const char str[] = "double fault"; static const char str[] = "double fault";
struct task_struct *tsk = current; struct task_struct *tsk = current;
#ifdef CONFIG_X86_ESPFIX64
extern unsigned char native_irq_return_iret[];
/*
* If IRET takes a non-IST fault on the espfix64 stack, then we
* end up promoting it to a doublefault. In that case, modify
* the stack to make it look like we just entered the #GP
* handler from user space, similar to bad_iret.
*/
if (((long)regs->sp >> PGDIR_SHIFT) == ESPFIX_PGD_ENTRY &&
regs->cs == __KERNEL_CS &&
regs->ip == (unsigned long)native_irq_return_iret)
{
struct pt_regs *normal_regs = task_pt_regs(current);
/* Fake a #GP(0) from userspace. */
memmove(&normal_regs->ip, (void *)regs->sp, 5*8);
normal_regs->orig_ax = 0; /* Missing (lost) #GP error code */
regs->ip = (unsigned long)general_protection;
regs->sp = (unsigned long)&normal_regs->orig_ax;
return;
}
#endif
exception_enter(); exception_enter();
/* Return not checked because double check cannot be ignored */ /* Return not checked because double check cannot be ignored */
notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_DF, SIGSEGV); notify_die(DIE_TRAP, str, regs, error_code, X86_TRAP_DF, SIGSEGV);
@ -399,6 +407,35 @@ asmlinkage __visible struct pt_regs *sync_regs(struct pt_regs *eregs)
return regs; return regs;
} }
NOKPROBE_SYMBOL(sync_regs); NOKPROBE_SYMBOL(sync_regs);
struct bad_iret_stack {
void *error_entry_ret;
struct pt_regs regs;
};
asmlinkage __visible
struct bad_iret_stack *fixup_bad_iret(struct bad_iret_stack *s)
{
/*
* This is called from entry_64.S early in handling a fault
* caused by a bad iret to user mode. To handle the fault
* correctly, we want move our stack frame to task_pt_regs
* and we want to pretend that the exception came from the
* iret target.
*/
struct bad_iret_stack *new_stack =
container_of(task_pt_regs(current),
struct bad_iret_stack, regs);
/* Copy the IRET target to the new stack. */
memmove(&new_stack->regs.ip, (void *)s->regs.sp, 5*8);
/* Copy the remainder of the stack from the current stack. */
memmove(new_stack, s, offsetof(struct bad_iret_stack, regs.ip));
BUG_ON(!user_mode_vm(&new_stack->regs));
return new_stack;
}
#endif #endif
/* /*
@ -778,7 +815,7 @@ void __init trap_init(void)
set_intr_gate(X86_TRAP_OLD_MF, coprocessor_segment_overrun); set_intr_gate(X86_TRAP_OLD_MF, coprocessor_segment_overrun);
set_intr_gate(X86_TRAP_TS, invalid_TSS); set_intr_gate(X86_TRAP_TS, invalid_TSS);
set_intr_gate(X86_TRAP_NP, segment_not_present); set_intr_gate(X86_TRAP_NP, segment_not_present);
set_intr_gate_ist(X86_TRAP_SS, &stack_segment, STACKFAULT_STACK); set_intr_gate(X86_TRAP_SS, stack_segment);
set_intr_gate(X86_TRAP_GP, general_protection); set_intr_gate(X86_TRAP_GP, general_protection);
set_intr_gate(X86_TRAP_SPURIOUS, spurious_interrupt_bug); set_intr_gate(X86_TRAP_SPURIOUS, spurious_interrupt_bug);
set_intr_gate(X86_TRAP_MF, coprocessor_error); set_intr_gate(X86_TRAP_MF, coprocessor_error);

View File

@ -630,7 +630,7 @@ static int mmu_spte_clear_track_bits(u64 *sptep)
* kvm mmu, before reclaiming the page, we should * kvm mmu, before reclaiming the page, we should
* unmap it from mmu first. * unmap it from mmu first.
*/ */
WARN_ON(!kvm_is_mmio_pfn(pfn) && !page_count(pfn_to_page(pfn))); WARN_ON(!kvm_is_reserved_pfn(pfn) && !page_count(pfn_to_page(pfn)));
if (!shadow_accessed_mask || old_spte & shadow_accessed_mask) if (!shadow_accessed_mask || old_spte & shadow_accessed_mask)
kvm_set_pfn_accessed(pfn); kvm_set_pfn_accessed(pfn);
@ -2461,7 +2461,7 @@ static int set_spte(struct kvm_vcpu *vcpu, u64 *sptep,
spte |= PT_PAGE_SIZE_MASK; spte |= PT_PAGE_SIZE_MASK;
if (tdp_enabled) if (tdp_enabled)
spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn, spte |= kvm_x86_ops->get_mt_mask(vcpu, gfn,
kvm_is_mmio_pfn(pfn)); kvm_is_reserved_pfn(pfn));
if (host_writable) if (host_writable)
spte |= SPTE_HOST_WRITEABLE; spte |= SPTE_HOST_WRITEABLE;
@ -2737,7 +2737,7 @@ static void transparent_hugepage_adjust(struct kvm_vcpu *vcpu,
* PT_PAGE_TABLE_LEVEL and there would be no adjustment done * PT_PAGE_TABLE_LEVEL and there would be no adjustment done
* here. * here.
*/ */
if (!is_error_noslot_pfn(pfn) && !kvm_is_mmio_pfn(pfn) && if (!is_error_noslot_pfn(pfn) && !kvm_is_reserved_pfn(pfn) &&
level == PT_PAGE_TABLE_LEVEL && level == PT_PAGE_TABLE_LEVEL &&
PageTransCompound(pfn_to_page(pfn)) && PageTransCompound(pfn_to_page(pfn)) &&
!has_wrprotected_page(vcpu->kvm, gfn, PT_DIRECTORY_LEVEL)) { !has_wrprotected_page(vcpu->kvm, gfn, PT_DIRECTORY_LEVEL)) {

View File

@ -1225,11 +1225,13 @@ static int fpga_probe(struct pci_dev *dev, const struct pci_device_id *id)
card->config_regs = pci_iomap(dev, 0, CONFIG_RAM_SIZE); card->config_regs = pci_iomap(dev, 0, CONFIG_RAM_SIZE);
if (!card->config_regs) { if (!card->config_regs) {
dev_warn(&dev->dev, "Failed to ioremap config registers\n"); dev_warn(&dev->dev, "Failed to ioremap config registers\n");
err = -ENOMEM;
goto out_release_regions; goto out_release_regions;
} }
card->buffers = pci_iomap(dev, 1, DATA_RAM_SIZE); card->buffers = pci_iomap(dev, 1, DATA_RAM_SIZE);
if (!card->buffers) { if (!card->buffers) {
dev_warn(&dev->dev, "Failed to ioremap data buffers\n"); dev_warn(&dev->dev, "Failed to ioremap data buffers\n");
err = -ENOMEM;
goto out_unmap_config; goto out_unmap_config;
} }

View File

@ -52,29 +52,26 @@ static unsigned long at91sam9x5_clk_usb_recalc_rate(struct clk_hw *hw,
tmp = pmc_read(pmc, AT91_PMC_USB); tmp = pmc_read(pmc, AT91_PMC_USB);
usbdiv = (tmp & AT91_PMC_OHCIUSBDIV) >> SAM9X5_USB_DIV_SHIFT; usbdiv = (tmp & AT91_PMC_OHCIUSBDIV) >> SAM9X5_USB_DIV_SHIFT;
return parent_rate / (usbdiv + 1);
return DIV_ROUND_CLOSEST(parent_rate, (usbdiv + 1));
} }
static long at91sam9x5_clk_usb_round_rate(struct clk_hw *hw, unsigned long rate, static long at91sam9x5_clk_usb_round_rate(struct clk_hw *hw, unsigned long rate,
unsigned long *parent_rate) unsigned long *parent_rate)
{ {
unsigned long div; unsigned long div;
unsigned long bestrate;
unsigned long tmp; if (!rate)
return -EINVAL;
if (rate >= *parent_rate) if (rate >= *parent_rate)
return *parent_rate; return *parent_rate;
div = *parent_rate / rate; div = DIV_ROUND_CLOSEST(*parent_rate, rate);
if (div >= SAM9X5_USB_MAX_DIV) if (div > SAM9X5_USB_MAX_DIV + 1)
return *parent_rate / (SAM9X5_USB_MAX_DIV + 1); div = SAM9X5_USB_MAX_DIV + 1;
bestrate = *parent_rate / div; return DIV_ROUND_CLOSEST(*parent_rate, div);
tmp = *parent_rate / (div + 1);
if (bestrate - rate > rate - tmp)
bestrate = tmp;
return bestrate;
} }
static int at91sam9x5_clk_usb_set_parent(struct clk_hw *hw, u8 index) static int at91sam9x5_clk_usb_set_parent(struct clk_hw *hw, u8 index)
@ -106,9 +103,13 @@ static int at91sam9x5_clk_usb_set_rate(struct clk_hw *hw, unsigned long rate,
u32 tmp; u32 tmp;
struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw); struct at91sam9x5_clk_usb *usb = to_at91sam9x5_clk_usb(hw);
struct at91_pmc *pmc = usb->pmc; struct at91_pmc *pmc = usb->pmc;
unsigned long div = parent_rate / rate; unsigned long div;
if (parent_rate % rate || div < 1 || div >= SAM9X5_USB_MAX_DIV) if (!rate)
return -EINVAL;
div = DIV_ROUND_CLOSEST(parent_rate, rate);
if (div > SAM9X5_USB_MAX_DIV + 1 || !div)
return -EINVAL; return -EINVAL;
tmp = pmc_read(pmc, AT91_PMC_USB) & ~AT91_PMC_OHCIUSBDIV; tmp = pmc_read(pmc, AT91_PMC_USB) & ~AT91_PMC_OHCIUSBDIV;
@ -253,7 +254,7 @@ static long at91rm9200_clk_usb_round_rate(struct clk_hw *hw, unsigned long rate,
tmp_parent_rate = rate * usb->divisors[i]; tmp_parent_rate = rate * usb->divisors[i];
tmp_parent_rate = __clk_round_rate(parent, tmp_parent_rate); tmp_parent_rate = __clk_round_rate(parent, tmp_parent_rate);
tmprate = tmp_parent_rate / usb->divisors[i]; tmprate = DIV_ROUND_CLOSEST(tmp_parent_rate, usb->divisors[i]);
if (tmprate < rate) if (tmprate < rate)
tmpdiff = rate - tmprate; tmpdiff = rate - tmprate;
else else
@ -281,10 +282,10 @@ static int at91rm9200_clk_usb_set_rate(struct clk_hw *hw, unsigned long rate,
struct at91_pmc *pmc = usb->pmc; struct at91_pmc *pmc = usb->pmc;
unsigned long div; unsigned long div;
if (!rate || parent_rate % rate) if (!rate)
return -EINVAL; return -EINVAL;
div = parent_rate / rate; div = DIV_ROUND_CLOSEST(parent_rate, rate);
for (i = 0; i < RM9200_USB_DIV_TAB_SIZE; i++) { for (i = 0; i < RM9200_USB_DIV_TAB_SIZE; i++) {
if (usb->divisors[i] == div) { if (usb->divisors[i] == div) {

View File

@ -263,6 +263,14 @@ static int clk_divider_bestdiv(struct clk_hw *hw, unsigned long rate,
if (!rate) if (!rate)
rate = 1; rate = 1;
/* if read only, just return current value */
if (divider->flags & CLK_DIVIDER_READ_ONLY) {
bestdiv = readl(divider->reg) >> divider->shift;
bestdiv &= div_mask(divider);
bestdiv = _get_div(divider, bestdiv);
return bestdiv;
}
maxdiv = _get_maxdiv(divider); maxdiv = _get_maxdiv(divider);
if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) { if (!(__clk_get_flags(hw->clk) & CLK_SET_RATE_PARENT)) {
@ -361,11 +369,6 @@ const struct clk_ops clk_divider_ops = {
}; };
EXPORT_SYMBOL_GPL(clk_divider_ops); EXPORT_SYMBOL_GPL(clk_divider_ops);
const struct clk_ops clk_divider_ro_ops = {
.recalc_rate = clk_divider_recalc_rate,
};
EXPORT_SYMBOL_GPL(clk_divider_ro_ops);
static struct clk *_register_divider(struct device *dev, const char *name, static struct clk *_register_divider(struct device *dev, const char *name,
const char *parent_name, unsigned long flags, const char *parent_name, unsigned long flags,
void __iomem *reg, u8 shift, u8 width, void __iomem *reg, u8 shift, u8 width,
@ -391,10 +394,7 @@ static struct clk *_register_divider(struct device *dev, const char *name,
} }
init.name = name; init.name = name;
if (clk_divider_flags & CLK_DIVIDER_READ_ONLY) init.ops = &clk_divider_ops;
init.ops = &clk_divider_ro_ops;
else
init.ops = &clk_divider_ops;
init.flags = flags | CLK_IS_BASIC; init.flags = flags | CLK_IS_BASIC;
init.parent_names = (parent_name ? &parent_name: NULL); init.parent_names = (parent_name ? &parent_name: NULL);
init.num_parents = (parent_name ? 1 : 0); init.num_parents = (parent_name ? 1 : 0);

View File

@ -322,7 +322,7 @@ static unsigned long clk_pxa27x_memory_get_rate(struct clk_hw *hw,
unsigned long ccsr = CCSR; unsigned long ccsr = CCSR;
osc_forced = ccsr & (1 << CCCR_CPDIS_BIT); osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
a = cccr & CCCR_A_BIT; a = cccr & (1 << CCCR_A_BIT);
l = ccsr & CCSR_L_MASK; l = ccsr & CCSR_L_MASK;
if (osc_forced || a) if (osc_forced || a)
@ -341,7 +341,7 @@ static u8 clk_pxa27x_memory_get_parent(struct clk_hw *hw)
unsigned long ccsr = CCSR; unsigned long ccsr = CCSR;
osc_forced = ccsr & (1 << CCCR_CPDIS_BIT); osc_forced = ccsr & (1 << CCCR_CPDIS_BIT);
a = cccr & CCCR_A_BIT; a = cccr & (1 << CCCR_A_BIT);
if (osc_forced) if (osc_forced)
return PXA_MEM_13Mhz; return PXA_MEM_13Mhz;
if (a) if (a)

View File

@ -3122,7 +3122,7 @@ static struct clk_regmap *mmcc_apq8084_clocks[] = {
[ESC1_CLK_SRC] = &esc1_clk_src.clkr, [ESC1_CLK_SRC] = &esc1_clk_src.clkr,
[HDMI_CLK_SRC] = &hdmi_clk_src.clkr, [HDMI_CLK_SRC] = &hdmi_clk_src.clkr,
[VSYNC_CLK_SRC] = &vsync_clk_src.clkr, [VSYNC_CLK_SRC] = &vsync_clk_src.clkr,
[RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr, [MMSS_RBCPR_CLK_SRC] = &rbcpr_clk_src.clkr,
[RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr, [RBBMTIMER_CLK_SRC] = &rbbmtimer_clk_src.clkr,
[MAPLE_CLK_SRC] = &maple_clk_src.clkr, [MAPLE_CLK_SRC] = &maple_clk_src.clkr,
[VDP_CLK_SRC] = &vdp_clk_src.clkr, [VDP_CLK_SRC] = &vdp_clk_src.clkr,

View File

@ -90,9 +90,7 @@ static struct clk *rockchip_clk_register_branch(const char *name,
div->width = div_width; div->width = div_width;
div->lock = lock; div->lock = lock;
div->table = div_table; div->table = div_table;
div_ops = (div_flags & CLK_DIVIDER_READ_ONLY) div_ops = &clk_divider_ops;
? &clk_divider_ro_ops
: &clk_divider_ops;
} }
clk = clk_register_composite(NULL, name, parent_names, num_parents, clk = clk_register_composite(NULL, name, parent_names, num_parents,

View File

@ -182,6 +182,12 @@ static void __init sun4i_timer_init(struct device_node *node)
/* Make sure timer is stopped before playing with interrupts */ /* Make sure timer is stopped before playing with interrupts */
sun4i_clkevt_time_stop(0); sun4i_clkevt_time_stop(0);
sun4i_clockevent.cpumask = cpu_possible_mask;
sun4i_clockevent.irq = irq;
clockevents_config_and_register(&sun4i_clockevent, rate,
TIMER_SYNC_TICKS, 0xffffffff);
ret = setup_irq(irq, &sun4i_timer_irq); ret = setup_irq(irq, &sun4i_timer_irq);
if (ret) if (ret)
pr_warn("failed to setup irq %d\n", irq); pr_warn("failed to setup irq %d\n", irq);
@ -189,12 +195,6 @@ static void __init sun4i_timer_init(struct device_node *node)
/* Enable timer0 interrupt */ /* Enable timer0 interrupt */
val = readl(timer_base + TIMER_IRQ_EN_REG); val = readl(timer_base + TIMER_IRQ_EN_REG);
writel(val | TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_EN_REG); writel(val | TIMER_IRQ_EN(0), timer_base + TIMER_IRQ_EN_REG);
sun4i_clockevent.cpumask = cpu_possible_mask;
sun4i_clockevent.irq = irq;
clockevents_config_and_register(&sun4i_clockevent, rate,
TIMER_SYNC_TICKS, 0xffffffff);
} }
CLOCKSOURCE_OF_DECLARE(sun4i, "allwinner,sun4i-a10-timer", CLOCKSOURCE_OF_DECLARE(sun4i, "allwinner,sun4i-a10-timer",
sun4i_timer_init); sun4i_timer_init);

View File

@ -185,6 +185,16 @@ static bool radeon_msi_ok(struct radeon_device *rdev)
if (rdev->flags & RADEON_IS_AGP) if (rdev->flags & RADEON_IS_AGP)
return false; return false;
/*
* Older chips have a HW limitation, they can only generate 40 bits
* of address for "64-bit" MSIs which breaks on some platforms, notably
* IBM POWER servers, so we limit them
*/
if (rdev->family < CHIP_BONAIRE) {
dev_info(rdev->dev, "radeon: MSI limited to 32-bit\n");
rdev->pdev->no_64bit_msi = 1;
}
/* force MSI on */ /* force MSI on */
if (radeon_msi == 1) if (radeon_msi == 1)
return true; return true;

View File

@ -1084,10 +1084,8 @@ static int g762_probe(struct i2c_client *client, const struct i2c_device_id *id)
if (ret) if (ret)
goto clock_dis; goto clock_dis;
data->hwmon_dev = devm_hwmon_device_register_with_groups(dev, data->hwmon_dev = hwmon_device_register_with_groups(dev, client->name,
client->name, data, g762_groups);
data,
g762_groups);
if (IS_ERR(data->hwmon_dev)) { if (IS_ERR(data->hwmon_dev)) {
ret = PTR_ERR(data->hwmon_dev); ret = PTR_ERR(data->hwmon_dev);
goto clock_dis; goto clock_dis;

View File

@ -44,6 +44,9 @@
#define BMC150_ACCEL_REG_INT_STATUS_2 0x0B #define BMC150_ACCEL_REG_INT_STATUS_2 0x0B
#define BMC150_ACCEL_ANY_MOTION_MASK 0x07 #define BMC150_ACCEL_ANY_MOTION_MASK 0x07
#define BMC150_ACCEL_ANY_MOTION_BIT_X BIT(0)
#define BMC150_ACCEL_ANY_MOTION_BIT_Y BIT(1)
#define BMC150_ACCEL_ANY_MOTION_BIT_Z BIT(2)
#define BMC150_ACCEL_ANY_MOTION_BIT_SIGN BIT(3) #define BMC150_ACCEL_ANY_MOTION_BIT_SIGN BIT(3)
#define BMC150_ACCEL_REG_PMU_LPW 0x11 #define BMC150_ACCEL_REG_PMU_LPW 0x11
@ -92,9 +95,9 @@
#define BMC150_ACCEL_SLOPE_THRES_MASK 0xFF #define BMC150_ACCEL_SLOPE_THRES_MASK 0xFF
/* Slope duration in terms of number of samples */ /* Slope duration in terms of number of samples */
#define BMC150_ACCEL_DEF_SLOPE_DURATION 2 #define BMC150_ACCEL_DEF_SLOPE_DURATION 1
/* in terms of multiples of g's/LSB, based on range */ /* in terms of multiples of g's/LSB, based on range */
#define BMC150_ACCEL_DEF_SLOPE_THRESHOLD 5 #define BMC150_ACCEL_DEF_SLOPE_THRESHOLD 1
#define BMC150_ACCEL_REG_XOUT_L 0x02 #define BMC150_ACCEL_REG_XOUT_L 0x02
@ -536,6 +539,9 @@ static int bmc150_accel_set_power_state(struct bmc150_accel_data *data, bool on)
if (ret < 0) { if (ret < 0) {
dev_err(&data->client->dev, dev_err(&data->client->dev,
"Failed: bmc150_accel_set_power_state for %d\n", on); "Failed: bmc150_accel_set_power_state for %d\n", on);
if (on)
pm_runtime_put_noidle(&data->client->dev);
return ret; return ret;
} }
@ -811,6 +817,7 @@ static int bmc150_accel_write_event_config(struct iio_dev *indio_dev,
ret = bmc150_accel_setup_any_motion_interrupt(data, state); ret = bmc150_accel_setup_any_motion_interrupt(data, state);
if (ret < 0) { if (ret < 0) {
bmc150_accel_set_power_state(data, false);
mutex_unlock(&data->mutex); mutex_unlock(&data->mutex);
return ret; return ret;
} }
@ -846,7 +853,7 @@ static const struct attribute_group bmc150_accel_attrs_group = {
static const struct iio_event_spec bmc150_accel_event = { static const struct iio_event_spec bmc150_accel_event = {
.type = IIO_EV_TYPE_ROC, .type = IIO_EV_TYPE_ROC,
.dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING, .dir = IIO_EV_DIR_EITHER,
.mask_separate = BIT(IIO_EV_INFO_VALUE) | .mask_separate = BIT(IIO_EV_INFO_VALUE) |
BIT(IIO_EV_INFO_ENABLE) | BIT(IIO_EV_INFO_ENABLE) |
BIT(IIO_EV_INFO_PERIOD) BIT(IIO_EV_INFO_PERIOD)
@ -1054,6 +1061,7 @@ static int bmc150_accel_data_rdy_trigger_set_state(struct iio_trigger *trig,
else else
ret = bmc150_accel_setup_new_data_interrupt(data, state); ret = bmc150_accel_setup_new_data_interrupt(data, state);
if (ret < 0) { if (ret < 0) {
bmc150_accel_set_power_state(data, false);
mutex_unlock(&data->mutex); mutex_unlock(&data->mutex);
return ret; return ret;
} }
@ -1092,12 +1100,26 @@ static irqreturn_t bmc150_accel_event_handler(int irq, void *private)
else else
dir = IIO_EV_DIR_RISING; dir = IIO_EV_DIR_RISING;
if (ret & BMC150_ACCEL_ANY_MOTION_MASK) if (ret & BMC150_ACCEL_ANY_MOTION_BIT_X)
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL, iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL,
0, 0,
IIO_MOD_X_OR_Y_OR_Z, IIO_MOD_X,
IIO_EV_TYPE_ROC, IIO_EV_TYPE_ROC,
IIO_EV_DIR_EITHER), dir),
data->timestamp);
if (ret & BMC150_ACCEL_ANY_MOTION_BIT_Y)
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL,
0,
IIO_MOD_Y,
IIO_EV_TYPE_ROC,
dir),
data->timestamp);
if (ret & BMC150_ACCEL_ANY_MOTION_BIT_Z)
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ACCEL,
0,
IIO_MOD_Z,
IIO_EV_TYPE_ROC,
dir),
data->timestamp); data->timestamp);
ack_intr_status: ack_intr_status:
if (!data->dready_trigger_on) if (!data->dready_trigger_on)
@ -1354,10 +1376,14 @@ static int bmc150_accel_runtime_suspend(struct device *dev)
{ {
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
struct bmc150_accel_data *data = iio_priv(indio_dev); struct bmc150_accel_data *data = iio_priv(indio_dev);
int ret;
dev_dbg(&data->client->dev, __func__); dev_dbg(&data->client->dev, __func__);
ret = bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0);
if (ret < 0)
return -EAGAIN;
return bmc150_accel_set_mode(data, BMC150_ACCEL_SLEEP_MODE_SUSPEND, 0); return 0;
} }
static int bmc150_accel_runtime_resume(struct device *dev) static int bmc150_accel_runtime_resume(struct device *dev)

View File

@ -269,6 +269,8 @@ static int kxcjk1013_set_range(struct kxcjk1013_data *data, int range_index)
return ret; return ret;
} }
ret &= ~(KXCJK1013_REG_CTRL1_BIT_GSEL0 |
KXCJK1013_REG_CTRL1_BIT_GSEL1);
ret |= (KXCJK1013_scale_table[range_index].gsel_0 << 3); ret |= (KXCJK1013_scale_table[range_index].gsel_0 << 3);
ret |= (KXCJK1013_scale_table[range_index].gsel_1 << 4); ret |= (KXCJK1013_scale_table[range_index].gsel_1 << 4);

View File

@ -152,6 +152,7 @@ static void men_z188_remove(struct mcb_device *dev)
static const struct mcb_device_id men_z188_ids[] = { static const struct mcb_device_id men_z188_ids[] = {
{ .device = 0xbc }, { .device = 0xbc },
{ }
}; };
MODULE_DEVICE_TABLE(mcb, men_z188_ids); MODULE_DEVICE_TABLE(mcb, men_z188_ids);

View File

@ -67,6 +67,9 @@
#define BMG160_REG_INT_EN_0 0x15 #define BMG160_REG_INT_EN_0 0x15
#define BMG160_DATA_ENABLE_INT BIT(7) #define BMG160_DATA_ENABLE_INT BIT(7)
#define BMG160_REG_INT_EN_1 0x16
#define BMG160_INT1_BIT_OD BIT(1)
#define BMG160_REG_XOUT_L 0x02 #define BMG160_REG_XOUT_L 0x02
#define BMG160_AXIS_TO_REG(axis) (BMG160_REG_XOUT_L + (axis * 2)) #define BMG160_AXIS_TO_REG(axis) (BMG160_REG_XOUT_L + (axis * 2))
@ -82,6 +85,9 @@
#define BMG160_REG_INT_STATUS_2 0x0B #define BMG160_REG_INT_STATUS_2 0x0B
#define BMG160_ANY_MOTION_MASK 0x07 #define BMG160_ANY_MOTION_MASK 0x07
#define BMG160_ANY_MOTION_BIT_X BIT(0)
#define BMG160_ANY_MOTION_BIT_Y BIT(1)
#define BMG160_ANY_MOTION_BIT_Z BIT(2)
#define BMG160_REG_TEMP 0x08 #define BMG160_REG_TEMP 0x08
#define BMG160_TEMP_CENTER_VAL 23 #define BMG160_TEMP_CENTER_VAL 23
@ -222,6 +228,19 @@ static int bmg160_chip_init(struct bmg160_data *data)
data->slope_thres = ret; data->slope_thres = ret;
/* Set default interrupt mode */ /* Set default interrupt mode */
ret = i2c_smbus_read_byte_data(data->client, BMG160_REG_INT_EN_1);
if (ret < 0) {
dev_err(&data->client->dev, "Error reading reg_int_en_1\n");
return ret;
}
ret &= ~BMG160_INT1_BIT_OD;
ret = i2c_smbus_write_byte_data(data->client,
BMG160_REG_INT_EN_1, ret);
if (ret < 0) {
dev_err(&data->client->dev, "Error writing reg_int_en_1\n");
return ret;
}
ret = i2c_smbus_write_byte_data(data->client, ret = i2c_smbus_write_byte_data(data->client,
BMG160_REG_INT_RST_LATCH, BMG160_REG_INT_RST_LATCH,
BMG160_INT_MODE_LATCH_INT | BMG160_INT_MODE_LATCH_INT |
@ -250,6 +269,9 @@ static int bmg160_set_power_state(struct bmg160_data *data, bool on)
if (ret < 0) { if (ret < 0) {
dev_err(&data->client->dev, dev_err(&data->client->dev,
"Failed: bmg160_set_power_state for %d\n", on); "Failed: bmg160_set_power_state for %d\n", on);
if (on)
pm_runtime_put_noidle(&data->client->dev);
return ret; return ret;
} }
#endif #endif
@ -705,6 +727,7 @@ static int bmg160_write_event_config(struct iio_dev *indio_dev,
ret = bmg160_setup_any_motion_interrupt(data, state); ret = bmg160_setup_any_motion_interrupt(data, state);
if (ret < 0) { if (ret < 0) {
bmg160_set_power_state(data, false);
mutex_unlock(&data->mutex); mutex_unlock(&data->mutex);
return ret; return ret;
} }
@ -743,7 +766,7 @@ static const struct attribute_group bmg160_attrs_group = {
static const struct iio_event_spec bmg160_event = { static const struct iio_event_spec bmg160_event = {
.type = IIO_EV_TYPE_ROC, .type = IIO_EV_TYPE_ROC,
.dir = IIO_EV_DIR_RISING | IIO_EV_DIR_FALLING, .dir = IIO_EV_DIR_EITHER,
.mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) | .mask_shared_by_type = BIT(IIO_EV_INFO_VALUE) |
BIT(IIO_EV_INFO_ENABLE) BIT(IIO_EV_INFO_ENABLE)
}; };
@ -871,6 +894,7 @@ static int bmg160_data_rdy_trigger_set_state(struct iio_trigger *trig,
else else
ret = bmg160_setup_new_data_interrupt(data, state); ret = bmg160_setup_new_data_interrupt(data, state);
if (ret < 0) { if (ret < 0) {
bmg160_set_power_state(data, false);
mutex_unlock(&data->mutex); mutex_unlock(&data->mutex);
return ret; return ret;
} }
@ -908,10 +932,24 @@ static irqreturn_t bmg160_event_handler(int irq, void *private)
else else
dir = IIO_EV_DIR_FALLING; dir = IIO_EV_DIR_FALLING;
if (ret & BMG160_ANY_MOTION_MASK) if (ret & BMG160_ANY_MOTION_BIT_X)
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL, iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
0, 0,
IIO_MOD_X_OR_Y_OR_Z, IIO_MOD_X,
IIO_EV_TYPE_ROC,
dir),
data->timestamp);
if (ret & BMG160_ANY_MOTION_BIT_Y)
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
0,
IIO_MOD_Y,
IIO_EV_TYPE_ROC,
dir),
data->timestamp);
if (ret & BMG160_ANY_MOTION_BIT_Z)
iio_push_event(indio_dev, IIO_MOD_EVENT_CODE(IIO_ANGL_VEL,
0,
IIO_MOD_Z,
IIO_EV_TYPE_ROC, IIO_EV_TYPE_ROC,
dir), dir),
data->timestamp); data->timestamp);
@ -1169,8 +1207,15 @@ static int bmg160_runtime_suspend(struct device *dev)
{ {
struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev)); struct iio_dev *indio_dev = i2c_get_clientdata(to_i2c_client(dev));
struct bmg160_data *data = iio_priv(indio_dev); struct bmg160_data *data = iio_priv(indio_dev);
int ret;
return bmg160_set_mode(data, BMG160_MODE_SUSPEND); ret = bmg160_set_mode(data, BMG160_MODE_SUSPEND);
if (ret < 0) {
dev_err(&data->client->dev, "set mode failed\n");
return -EAGAIN;
}
return 0;
} }
static int bmg160_runtime_resume(struct device *dev) static int bmg160_runtime_resume(struct device *dev)

View File

@ -1179,9 +1179,19 @@ static int xpad_probe(struct usb_interface *intf, const struct usb_device_id *id
} }
ep_irq_in = &intf->cur_altsetting->endpoint[1].desc; ep_irq_in = &intf->cur_altsetting->endpoint[1].desc;
usb_fill_bulk_urb(xpad->bulk_out, udev, if (usb_endpoint_is_bulk_out(ep_irq_in)) {
usb_sndbulkpipe(udev, ep_irq_in->bEndpointAddress), usb_fill_bulk_urb(xpad->bulk_out, udev,
xpad->bdata, XPAD_PKT_LEN, xpad_bulk_out, xpad); usb_sndbulkpipe(udev,
ep_irq_in->bEndpointAddress),
xpad->bdata, XPAD_PKT_LEN,
xpad_bulk_out, xpad);
} else {
usb_fill_int_urb(xpad->bulk_out, udev,
usb_sndintpipe(udev,
ep_irq_in->bEndpointAddress),
xpad->bdata, XPAD_PKT_LEN,
xpad_bulk_out, xpad, 0);
}
/* /*
* Submit the int URB immediately rather than waiting for open * Submit the int URB immediately rather than waiting for open

View File

@ -428,14 +428,6 @@ static void elantech_report_trackpoint(struct psmouse *psmouse,
int x, y; int x, y;
u32 t; u32 t;
if (dev_WARN_ONCE(&psmouse->ps2dev.serio->dev,
!tp_dev,
psmouse_fmt("Unexpected trackpoint message\n"))) {
if (etd->debug == 1)
elantech_packet_dump(psmouse);
return;
}
t = get_unaligned_le32(&packet[0]); t = get_unaligned_le32(&packet[0]);
switch (t & ~7U) { switch (t & ~7U) {
@ -793,7 +785,7 @@ static int elantech_packet_check_v4(struct psmouse *psmouse)
unsigned char packet_type = packet[3] & 0x03; unsigned char packet_type = packet[3] & 0x03;
bool sanity_check; bool sanity_check;
if ((packet[3] & 0x0f) == 0x06) if (etd->tp_dev && (packet[3] & 0x0f) == 0x06)
return PACKET_TRACKPOINT; return PACKET_TRACKPOINT;
/* /*

View File

@ -143,6 +143,10 @@ static const struct min_max_quirk min_max_pnpid_table[] = {
(const char * const []){"LEN2001", NULL}, (const char * const []){"LEN2001", NULL},
1024, 5022, 2508, 4832 1024, 5022, 2508, 4832
}, },
{
(const char * const []){"LEN2006", NULL},
1264, 5675, 1171, 4688
},
{ } { }
}; };

View File

@ -217,8 +217,9 @@ struct irq_domain *__init aic_common_of_init(struct device_node *node,
} }
ret = irq_alloc_domain_generic_chips(domain, 32, 1, name, ret = irq_alloc_domain_generic_chips(domain, 32, 1, name,
handle_level_irq, 0, 0, handle_fasteoi_irq,
IRQCHIP_SKIP_SET_WAKE); IRQ_NOREQUEST | IRQ_NOPROBE |
IRQ_NOAUTOEN, 0, 0);
if (ret) if (ret)
goto err_domain_remove; goto err_domain_remove;
@ -230,7 +231,6 @@ struct irq_domain *__init aic_common_of_init(struct device_node *node,
gc->unused = 0; gc->unused = 0;
gc->wake_enabled = ~0; gc->wake_enabled = ~0;
gc->chip_types[0].type = IRQ_TYPE_SENSE_MASK; gc->chip_types[0].type = IRQ_TYPE_SENSE_MASK;
gc->chip_types[0].handler = handle_fasteoi_irq;
gc->chip_types[0].chip.irq_eoi = irq_gc_eoi; gc->chip_types[0].chip.irq_eoi = irq_gc_eoi;
gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake; gc->chip_types[0].chip.irq_set_wake = irq_gc_set_wake;
gc->chip_types[0].chip.irq_shutdown = aic_common_shutdown; gc->chip_types[0].chip.irq_shutdown = aic_common_shutdown;

View File

@ -101,9 +101,9 @@ static int bcm7120_l2_intc_init_one(struct device_node *dn,
int parent_irq; int parent_irq;
parent_irq = irq_of_parse_and_map(dn, irq); parent_irq = irq_of_parse_and_map(dn, irq);
if (parent_irq < 0) { if (!parent_irq) {
pr_err("failed to map interrupt %d\n", irq); pr_err("failed to map interrupt %d\n", irq);
return parent_irq; return -EINVAL;
} }
data->irq_map_mask |= be32_to_cpup(map_mask + irq); data->irq_map_mask |= be32_to_cpup(map_mask + irq);

View File

@ -135,9 +135,9 @@ int __init brcmstb_l2_intc_of_init(struct device_node *np,
__raw_writel(0xffffffff, data->base + CPU_CLEAR); __raw_writel(0xffffffff, data->base + CPU_CLEAR);
data->parent_irq = irq_of_parse_and_map(np, 0); data->parent_irq = irq_of_parse_and_map(np, 0);
if (data->parent_irq < 0) { if (!data->parent_irq) {
pr_err("failed to find parent interrupt\n"); pr_err("failed to find parent interrupt\n");
ret = data->parent_irq; ret = -EINVAL;
goto out_unmap; goto out_unmap;
} }

View File

@ -377,6 +377,29 @@ static irqreturn_t bcm_sf2_switch_1_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static int bcm_sf2_sw_rst(struct bcm_sf2_priv *priv)
{
unsigned int timeout = 1000;
u32 reg;
reg = core_readl(priv, CORE_WATCHDOG_CTRL);
reg |= SOFTWARE_RESET | EN_CHIP_RST | EN_SW_RESET;
core_writel(priv, reg, CORE_WATCHDOG_CTRL);
do {
reg = core_readl(priv, CORE_WATCHDOG_CTRL);
if (!(reg & SOFTWARE_RESET))
break;
usleep_range(1000, 2000);
} while (timeout-- > 0);
if (timeout == 0)
return -ETIMEDOUT;
return 0;
}
static int bcm_sf2_sw_setup(struct dsa_switch *ds) static int bcm_sf2_sw_setup(struct dsa_switch *ds)
{ {
const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME; const char *reg_names[BCM_SF2_REGS_NUM] = BCM_SF2_REGS_NAME;
@ -404,11 +427,18 @@ static int bcm_sf2_sw_setup(struct dsa_switch *ds)
*base = of_iomap(dn, i); *base = of_iomap(dn, i);
if (*base == NULL) { if (*base == NULL) {
pr_err("unable to find register: %s\n", reg_names[i]); pr_err("unable to find register: %s\n", reg_names[i]);
return -ENODEV; ret = -ENOMEM;
goto out_unmap;
} }
base++; base++;
} }
ret = bcm_sf2_sw_rst(priv);
if (ret) {
pr_err("unable to software reset switch: %d\n", ret);
goto out_unmap;
}
/* Disable all interrupts and request them */ /* Disable all interrupts and request them */
intrl2_0_writel(priv, 0xffffffff, INTRL2_CPU_MASK_SET); intrl2_0_writel(priv, 0xffffffff, INTRL2_CPU_MASK_SET);
intrl2_0_writel(priv, 0xffffffff, INTRL2_CPU_CLEAR); intrl2_0_writel(priv, 0xffffffff, INTRL2_CPU_CLEAR);
@ -484,7 +514,8 @@ out_free_irq0:
out_unmap: out_unmap:
base = &priv->core; base = &priv->core;
for (i = 0; i < BCM_SF2_REGS_NUM; i++) { for (i = 0; i < BCM_SF2_REGS_NUM; i++) {
iounmap(*base); if (*base)
iounmap(*base);
base++; base++;
} }
return ret; return ret;
@ -733,29 +764,6 @@ static int bcm_sf2_sw_suspend(struct dsa_switch *ds)
return 0; return 0;
} }
static int bcm_sf2_sw_rst(struct bcm_sf2_priv *priv)
{
unsigned int timeout = 1000;
u32 reg;
reg = core_readl(priv, CORE_WATCHDOG_CTRL);
reg |= SOFTWARE_RESET | EN_CHIP_RST | EN_SW_RESET;
core_writel(priv, reg, CORE_WATCHDOG_CTRL);
do {
reg = core_readl(priv, CORE_WATCHDOG_CTRL);
if (!(reg & SOFTWARE_RESET))
break;
usleep_range(1000, 2000);
} while (timeout-- > 0);
if (timeout == 0)
return -ETIMEDOUT;
return 0;
}
static int bcm_sf2_sw_resume(struct dsa_switch *ds) static int bcm_sf2_sw_resume(struct dsa_switch *ds)
{ {
struct bcm_sf2_priv *priv = ds_to_priv(ds); struct bcm_sf2_priv *priv = ds_to_priv(ds);

View File

@ -8563,7 +8563,8 @@ static int tg3_init_rings(struct tg3 *tp)
if (tnapi->rx_rcb) if (tnapi->rx_rcb)
memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp)); memset(tnapi->rx_rcb, 0, TG3_RX_RCB_RING_BYTES(tp));
if (tg3_rx_prodring_alloc(tp, &tnapi->prodring)) { if (tnapi->prodring.rx_std &&
tg3_rx_prodring_alloc(tp, &tnapi->prodring)) {
tg3_free_rings(tp); tg3_free_rings(tp);
return -ENOMEM; return -ENOMEM;
} }

Some files were not shown because too many files have changed in this diff Show More