Merge 4.14.155 into android-4.14-q
Changes in 4.14.155 kvm: mmu: Don't read PDPTEs when paging is not enabled KVM: x86: introduce is_pae_paging MIPS: BCM63XX: fix switch core reset on BCM6368 scsi: core: Handle drivers which set sg_tablesize to zero Revert "Input: synaptics-rmi4 - avoid processing unknown IRQs" powerpc/perf: Fix IMC_MAX_PMU macro powerpc/perf: Fix kfree memory allocated for nest pmus ax88172a: fix information leak on short answers net: usb: qmi_wwan: add support for Foxconn T77W968 LTE modules slip: Fix memory leak in slip_open error path ALSA: usb-audio: Fix missing error check at mixer resolution test ALSA: usb-audio: not submit urb for stopped endpoint Input: ff-memless - kill timer in destroy() Input: synaptics-rmi4 - fix video buffer size Input: synaptics-rmi4 - disable the relative position IRQ in the F12 driver Input: synaptics-rmi4 - do not consume more data than we have (F11, F12) Input: synaptics-rmi4 - clear IRQ enables for F54 Input: synaptics-rmi4 - destroy F54 poller workqueue when removing IB/hfi1: Ensure full Gen3 speed in a Gen4 system i2c: acpi: Force bus speed to 400KHz if a Silead touchscreen is present ecryptfs_lookup_interpose(): lower_dentry->d_inode is not stable ecryptfs_lookup_interpose(): lower_dentry->d_parent is not stable either iommu/vt-d: Fix QI_DEV_IOTLB_PFSID and QI_DEV_EIOTLB_PFSID macros mm: memcg: switch to css_tryget() in get_mem_cgroup_from_mm() mm: hugetlb: switch to css_tryget() in hugetlb_cgroup_charge_cgroup() mmc: sdhci-of-at91: fix quirk2 overwrite iio: adc: max9611: explicitly cast gain_selectors tee: optee: take DT status property into account ath10k: fix kernel panic by moving pci flush after napi_disable iio: dac: mcp4922: fix error handling in mcp4922_write_raw arm64: dts: allwinner: a64: Olinuxino: fix DRAM voltage arm64: dts: allwinner: a64: NanoPi-A64: Fix DCDC1 voltage ALSA: pcm: signedness bug in snd_pcm_plug_alloc() arm64: dts: tegra210-p2180: Correct sdmmc4 vqmmc-supply ARM: dts: at91/trivial: Fix USART1 definition for at91sam9g45 rtc: rv8803: fix the rv8803 id in the OF table remoteproc/davinci: Use %zx for formating size_t extcon: cht-wc: Return from default case to avoid warnings cfg80211: Avoid regulatory restore when COUNTRY_IE_IGNORE is set ALSA: seq: Do error checks at creating system ports ath9k: fix tx99 with monitor mode interface ath10k: limit available channels via DT ieee80211-freq-limit gfs2: Don't set GFS2_RDF_UPTODATE when the lvb is updated ASoC: dpcm: Properly initialise hw->rate_max pinctrl: ingenic: Probe driver at subsys_initcall MIPS: BCM47XX: Enable USB power on Netgear WNDR3400v3 ARM: dts: exynos: Fix sound in Snow-rev5 Chromebook liquidio: fix race condition in instruction completion processing ARM: dts: exynos: Fix regulators configuration on Peach Pi/Pit Chromebooks i40e: use correct length for strncpy i40e: hold the rtnl lock on clearing interrupt scheme i40e: Prevent deleting MAC address from VF when set by PF IB/rxe: fixes for rdma read retry iwlwifi: don't WARN on trying to dump dead firmware iwlwifi: mvm: avoid sending too many BARs ARM: dts: pxa: fix the rtc controller ARM: dts: pxa: fix power i2c base address rtl8187: Fix warning generated when strncpy() destination length matches the sixe argument soc: imx: gpc: fix PDN delay ASoC: rsnd: ssi: Fix issue in dma data address assignment net: phy: mscc: read 'vsc8531,vddmac' as an u32 net: phy: mscc: read 'vsc8531, edge-slowdown' as an u32 ARM: dts: meson8: fix the clock controller register size ARM: dts: meson8b: fix the clock controller register size net: lan78xx: Bail out if lan78xx_get_endpoints fails ASoC: sgtl5000: avoid division by zero if lo_vag is zero ARM: dts: exynos: Disable pull control for S5M8767 PMIC ath10k: wmi: disable softirq's while calling ieee80211_rx IB/ipoib: Ensure that MTU isn't less than minimum permitted RDMA/core: Rate limit MAD error messages RDMA/core: Follow correct unregister order between sysfs and cgroup mips: txx9: fix iounmap related issue ASoC: Intel: hdac_hdmi: Limit sampling rates at dai creation of: make PowerMac cache node search conditional on CONFIG_PPC_PMAC ARM: dts: omap3-gta04: give spi_lcd node a label so that we can overwrite in other DTS files ARM: dts: omap3-gta04: fixes for tvout / venc ARM: dts: omap3-gta04: tvout: enable as display1 alias ARM: dts: omap3-gta04: fix touchscreen tsc2007 ARM: dts: omap3-gta04: make NAND partitions compatible with recent U-Boot ARM: dts: omap3-gta04: keep vpll2 always on sched/debug: Use symbolic names for task state constants arm64: dts: rockchip: Fix VCC5V0_HOST_EN on rk3399-sapphire dmaengine: dma-jz4780: Don't depend on MACH_JZ4780 dmaengine: dma-jz4780: Further residue status fix EDAC, sb_edac: Return early on ADDRV bit and address type test rtc: mt6397: fix possible race condition rtc: pl030: fix possible race condition ath9k: add back support for using active monitor interfaces for tx99 IB/hfi1: Missing return value in error path for user sdma signal: Always ignore SIGKILL and SIGSTOP sent to the global init signal: Properly deliver SIGILL from uprobes signal: Properly deliver SIGSEGV from x86 uprobes f2fs: fix memory leak of percpu counter in fill_super() scsi: qla2xxx: Fix iIDMA error scsi: qla2xxx: Defer chip reset until target mode is enabled scsi: qla2xxx: Fix dropped srb resource. scsi: lpfc: Fix errors in log messages. scsi: sym53c8xx: fix NULL pointer dereference panic in sym_int_sir() ARM: imx6: register pm_power_off handler if "fsl,pmic-stby-poweroff" is set scsi: pm80xx: Corrected dma_unmap_sg() parameter scsi: pm80xx: Fixed system hang issue during kexec boot kprobes: Don't call BUG_ON() if there is a kprobe in use on free list Drivers: hv: vmbus: Fix synic per-cpu context initialization nvmem: core: return error code instead of NULL from nvmem_device_get media: dt-bindings: adv748x: Fix decimal unit addresses media: fix: media: pci: meye: validate offset to avoid arbitrary access media: dvb: fix compat ioctl translation arm64: dts: meson: libretech: update board model ALSA: intel8x0m: Register irq handler after register initializations pinctrl: at91-pio4: fix has_config check in atmel_pctl_dt_subnode_to_map() llc: avoid blocking in llc_sap_close() ARM: dts: qcom: ipq4019: fix cpu0's qcom,saw2 reg value soc: qcom: wcnss_ctrl: Avoid string overflow powerpc/vdso: Correct call frame information ARM: dts: socfpga: Fix I2C bus unit-address error pinctrl: at91: don't use the same irqchip with multiple gpiochips cxgb4: Fix endianness issue in t4_fwcache() blok, bfq: do not plug I/O if all queues are weight-raised arm64: dts: meson: Fix erroneous SPI bus warnings power: supply: ab8500_fg: silence uninitialized variable warnings power: reset: at91-poweroff: do not procede if at91_shdwc is allocated power: supply: max8998-charger: Fix platform data retrieval component: fix loop condition to call unbind() if bind() fails kernfs: Fix range checks in kernfs_get_target_path ip_gre: fix parsing gre header in ipgre_err ARM: dts: rockchip: Fix erroneous SPI bus dtc warnings on rk3036 ACPI / LPSS: Exclude I2C busses shared with PUNIT from pmc_atom_d3_mask ath9k: Fix a locking bug in ath9k_add_interface() s390/qeth: invoke softirqs after napi_schedule() PCI/ACPI: Correct error message for ASPM disabling serial: uartps: Fix suspend functionality serial: samsung: Enable baud clock for UART reset procedure in resume serial: mxs-auart: Fix potential infinite loop samples/bpf: fix a compilation failure spi: mediatek: Don't modify spi_transfer when transfer. ipmi:dmi: Ignore IPMI SMBIOS entries with a zero base address net: hns3: fix return type of ndo_start_xmit function powerpc/iommu: Avoid derefence before pointer check powerpc/64s/hash: Fix stab_rr off by one initialization powerpc/pseries: Disable CPU hotplug across migrations powerpc: Fix duplicate const clang warning in user access code RDMA/i40iw: Fix incorrect iterator type OPP: Protect dev_list with opp_table lock libfdt: Ensure INT_MAX is defined in libfdt_env.h power: supply: twl4030_charger: fix charging current out-of-bounds power: supply: twl4030_charger: disable eoc interrupt on linear charge net: toshiba: fix return type of ndo_start_xmit function net: xilinx: fix return type of ndo_start_xmit function net: broadcom: fix return type of ndo_start_xmit function net: amd: fix return type of ndo_start_xmit function net: sun: fix return type of ndo_start_xmit function net: hns3: Fix for setting speed for phy failed problem net: hns3: Fix parameter type for q_id in hclge_tm_q_to_qs_map_cfg() nfp: provide a better warning when ring allocation fails usb: chipidea: imx: enable OTG overcurrent in case USB subsystem is already started usb: chipidea: Fix otg event handler mlxsw: spectrum: Init shaper for TCs 8..15 ARM: dts: am335x-evm: fix number of cpsw f2fs: fix to recover inode's uid/gid during POR ARM: dts: ux500: Correct SCU unit address ARM: dts: ux500: Fix LCDA clock line muxing ARM: dts: ste: Fix SPI controller node names spi: pic32: Use proper enum in dmaengine_prep_slave_rg cpufeature: avoid warning when compiling with clang crypto: arm/crc32 - avoid warning when compiling with Clang ARM: dts: marvell: Fix SPI and I2C bus warnings x86/mce-inject: Reset injection struct after injection ARM: dts: clearfog: fix sdhci supply property name bnx2x: Ignore bandwidth attention in single function mode samples/bpf: fix compilation failure net: phy: mdio-bcm-unimac: Allow configuring MDIO clock divider net: micrel: fix return type of ndo_start_xmit function net: freescale: fix return type of ndo_start_xmit function x86/CPU: Use correct macros for Cyrix calls x86/CPU: Change query logic so CPUID is enabled before testing MIPS: kexec: Relax memory restriction arm64: dts: rockchip: Fix microSD in rk3399 sapphire board media: pci: ivtv: Fix a sleep-in-atomic-context bug in ivtv_yuv_init() media: au0828: Fix incorrect error messages media: davinci: Fix implicit enum conversion warning ARM: dts: rockchip: explicitly set vcc_sd0 pin to gpio on rk3188-radxarock usb: gadget: uvc: configfs: Drop leaked references to config items usb: gadget: uvc: configfs: Prevent format changes after linking header i2c: aspeed: fix invalid clock parameters for very large divisors phy: brcm-sata: allow PHY_BRCM_SATA driver to be built for DSL SoCs phy: renesas: rcar-gen3-usb2: fix vbus_ctrl for role sysfs phy: phy-twl4030-usb: fix denied runtime access usb: gadget: uvc: Factor out video USB request queueing usb: gadget: uvc: Only halt video streaming endpoint in bulk mode coresight: Fix handling of sinks coresight: perf: Fix per cpu path management coresight: perf: Disable trace path upon source error coresight: etm4x: Configure EL2 exception level when kernel is running in HYP coresight: tmc: Fix byte-address alignment for RRP misc: kgdbts: Fix restrict error misc: genwqe: should return proper error value. vfio/pci: Fix potential memory leak in vfio_msi_cap_len vfio/pci: Mask buggy SR-IOV VF INTx support scsi: libsas: always unregister the old device if going to discover new phy: lantiq: Fix compile warning ARM: dts: tegra30: fix xcvr-setup-use-fuses ARM: tegra: apalis_t30: fix mmc1 cmd pull-up ARM: dts: paz00: fix wakeup gpio keycode net: smsc: fix return type of ndo_start_xmit function net: faraday: fix return type of ndo_start_xmit function f2fs: fix to recover inode's project id during POR f2fs: mark inode dirty explicitly in recover_inode() EDAC: Raise the maximum number of memory controllers ARM: dts: realview: Fix SPI controller node names firmware: dell_rbu: Make payload memory uncachable Bluetooth: hci_serdev: clear HCI_UART_PROTO_READY to avoid closing proto races Bluetooth: L2CAP: Detect if remote is not able to use the whole MPS x86/hyperv: Suppress "PCI: Fatal: No config space access function found" crypto: s5p-sss: Fix Fix argument list alignment crypto: fix a memory leak in rsa-kcs1pad's encryption mode iwlwifi: dbg: don't crash if the firmware crashes in the middle of a debug dump iwlwifi: api: annotate compressed BA notif array sizes iwlwifi: mvm: Allow TKIP for AP mode scsi: NCR5380: Clear all unissued commands on host reset scsi: NCR5380: Have NCR5380_select() return a bool scsi: NCR5380: Withhold disconnect privilege for REQUEST SENSE scsi: NCR5380: Use DRIVER_SENSE to indicate valid sense data scsi: NCR5380: Check for invalid reselection target scsi: NCR5380: Don't clear busy flag when abort fails scsi: NCR5380: Don't call dsprintk() following reselection interrupt scsi: NCR5380: Handle BUS FREE during reselection scsi: NCR5380: Check for bus reset arm64: dts: amd: Fix SPI bus warnings arm64: dts: lg: Fix SPI controller node names ARM: dts: lpc32xx: Fix SPI controller node names rtc: armada38x: fix possible race condition netfilter: masquerade: don't flush all conntracks if only one address deleted on device usb: xhci-mtk: fix ISOC error when interval is zero fuse: use READ_ONCE on congestion_threshold and max_background IB/iser: Fix possible NULL deref at iser_inv_desc() net: phy: mdio-bcm-unimac: mark PM functions as __maybe_unused memfd: Use radix_tree_deref_slot_protected to avoid the warning. slcan: Fix memory leak in error path Linux 4.14.155 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -73,7 +73,7 @@ Example:
|
||||
};
|
||||
};
|
||||
|
||||
port@10 {
|
||||
port@a {
|
||||
reg = <10>;
|
||||
|
||||
adv7482_txa: endpoint {
|
||||
@@ -83,7 +83,7 @@ Example:
|
||||
};
|
||||
};
|
||||
|
||||
port@11 {
|
||||
port@b {
|
||||
reg = <11>;
|
||||
|
||||
adv7482_txb: endpoint {
|
||||
|
||||
@@ -19,6 +19,9 @@ Optional properties:
|
||||
- interrupt-names: must be "mdio_done_error" when there is a share interrupt fed
|
||||
to this hardware block, or must be "mdio_done" for the first interrupt and
|
||||
"mdio_error" for the second when there are separate interrupts
|
||||
- clocks: A reference to the clock supplying the MDIO bus controller
|
||||
- clock-frequency: the MDIO bus clock that must be output by the MDIO bus
|
||||
hardware, if absent, the default hardware values are used
|
||||
|
||||
Child nodes of this MDIO bus controller node are standard Ethernet PHY device
|
||||
nodes as described in Documentation/devicetree/bindings/net/phy.txt
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 14
|
||||
SUBLEVEL = 154
|
||||
SUBLEVEL = 155
|
||||
EXTRAVERSION =
|
||||
NAME = Petit Gorille
|
||||
|
||||
|
||||
@@ -6,6 +6,8 @@
|
||||
#include <linux/string.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
#define INT_MAX ((int)(~0U>>1))
|
||||
|
||||
typedef __be16 fdt16_t;
|
||||
typedef __be32 fdt32_t;
|
||||
typedef __be64 fdt64_t;
|
||||
|
||||
@@ -724,6 +724,7 @@
|
||||
pinctrl-0 = <&cpsw_default>;
|
||||
pinctrl-1 = <&cpsw_sleep>;
|
||||
status = "okay";
|
||||
slaves = <1>;
|
||||
};
|
||||
|
||||
&davinci_mdio {
|
||||
@@ -731,15 +732,14 @@
|
||||
pinctrl-0 = <&davinci_mdio_default>;
|
||||
pinctrl-1 = <&davinci_mdio_sleep>;
|
||||
status = "okay";
|
||||
|
||||
ethphy0: ethernet-phy@0 {
|
||||
reg = <0>;
|
||||
};
|
||||
};
|
||||
|
||||
&cpsw_emac0 {
|
||||
phy_id = <&davinci_mdio>, <0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
};
|
||||
|
||||
&cpsw_emac1 {
|
||||
phy_id = <&davinci_mdio>, <1>;
|
||||
phy-handle = <ðphy0>;
|
||||
phy-mode = "rgmii-txid";
|
||||
};
|
||||
|
||||
|
||||
@@ -334,7 +334,7 @@
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
||||
|
||||
ssp: ssp@1000d000 {
|
||||
ssp: spi@1000d000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x1000d000 0x1000>;
|
||||
clocks = <&sspclk>, <&pclk>;
|
||||
|
||||
@@ -343,7 +343,7 @@
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
|
||||
pb1176_ssp: ssp@1010b000 {
|
||||
pb1176_ssp: spi@1010b000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x1010b000 0x1000>;
|
||||
interrupt-parent = <&intc_dc1176>;
|
||||
|
||||
@@ -480,7 +480,7 @@
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
||||
|
||||
ssp@1000d000 {
|
||||
spi@1000d000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x1000d000 0x1000>;
|
||||
interrupt-parent = <&intc_pb11mp>;
|
||||
|
||||
@@ -318,7 +318,7 @@
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
||||
|
||||
ssp: ssp@1000d000 {
|
||||
ssp: spi@1000d000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x1000d000 0x1000>;
|
||||
clocks = <&sspclk>, <&pclk>;
|
||||
|
||||
@@ -89,7 +89,7 @@
|
||||
&clearfog_sdhci_cd_pins>;
|
||||
pinctrl-names = "default";
|
||||
status = "okay";
|
||||
vmmc = <®_3p3v>;
|
||||
vmmc-supply = <®_3p3v>;
|
||||
wp-inverted;
|
||||
};
|
||||
|
||||
|
||||
@@ -566,7 +566,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
uart1 {
|
||||
usart1 {
|
||||
pinctrl_usart1: usart1-0 {
|
||||
atmel,pins =
|
||||
<AT91_PIOB 4 AT91_PERIPH_A AT91_PINCTRL_PULL_UP /* PB4 periph A with pullup */
|
||||
|
||||
@@ -87,7 +87,7 @@
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
|
||||
si5351: clock-generator {
|
||||
si5351: clock-generator@60 {
|
||||
compatible = "silabs,si5351a-msop";
|
||||
reg = <0x60>;
|
||||
#address-cells = <1>;
|
||||
|
||||
@@ -155,7 +155,7 @@
|
||||
0xffffe000 MBUS_ID(0x03, 0x01) 0 0x0000800 /* CESA SRAM 2k */
|
||||
0xfffff000 MBUS_ID(0x0d, 0x00) 0 0x0000800>; /* PMU SRAM 2k */
|
||||
|
||||
spi0: spi-ctrl@10600 {
|
||||
spi0: spi@10600 {
|
||||
compatible = "marvell,orion-spi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
@@ -168,7 +168,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
i2c: i2c-ctrl@11000 {
|
||||
i2c: i2c@11000 {
|
||||
compatible = "marvell,mv64xxx-i2c";
|
||||
reg = <0x11000 0x20>;
|
||||
#address-cells = <1>;
|
||||
@@ -218,7 +218,7 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
spi1: spi-ctrl@14600 {
|
||||
spi1: spi@14600 {
|
||||
compatible = "marvell,orion-spi";
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
@@ -169,6 +169,8 @@
|
||||
reg = <0x66>;
|
||||
interrupt-parent = <&gpx3>;
|
||||
interrupts = <2 IRQ_TYPE_LEVEL_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&s5m8767_irq>;
|
||||
|
||||
vinb1-supply = <&main_dc_reg>;
|
||||
vinb2-supply = <&main_dc_reg>;
|
||||
@@ -544,6 +546,13 @@
|
||||
cap-sd-highspeed;
|
||||
};
|
||||
|
||||
&pinctrl_0 {
|
||||
s5m8767_irq: s5m8767-irq {
|
||||
samsung,pins = "gpx3-2";
|
||||
samsung,pin-pud = <EXYNOS_PIN_PULL_NONE>;
|
||||
};
|
||||
};
|
||||
|
||||
&rtc {
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -23,6 +23,14 @@
|
||||
|
||||
samsung,model = "Snow-I2S-MAX98090";
|
||||
samsung,audio-codec = <&max98090>;
|
||||
|
||||
cpu {
|
||||
sound-dai = <&i2s0 0>;
|
||||
};
|
||||
|
||||
codec {
|
||||
sound-dai = <&max98090 0>, <&hdmi>;
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -34,6 +42,9 @@
|
||||
interrupt-parent = <&gpx0>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&max98090_irq>;
|
||||
clocks = <&pmu_system_controller 0>;
|
||||
clock-names = "mclk";
|
||||
#sound-dai-cells = <1>;
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
@@ -301,6 +301,7 @@
|
||||
regulator-name = "vdd_1v35";
|
||||
regulator-min-microvolt = <1350000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
@@ -322,6 +323,7 @@
|
||||
regulator-name = "vdd_2v";
|
||||
regulator-min-microvolt = <2000000>;
|
||||
regulator-max-microvolt = <2000000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
@@ -332,6 +334,7 @@
|
||||
regulator-name = "vdd_1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
|
||||
@@ -301,6 +301,7 @@
|
||||
regulator-name = "vdd_1v35";
|
||||
regulator-min-microvolt = <1350000>;
|
||||
regulator-max-microvolt = <1350000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
@@ -322,6 +323,7 @@
|
||||
regulator-name = "vdd_2v";
|
||||
regulator-min-microvolt = <2000000>;
|
||||
regulator-max-microvolt = <2000000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
@@ -332,6 +334,7 @@
|
||||
regulator-name = "vdd_1v8";
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <1800000>;
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
|
||||
@@ -179,7 +179,7 @@
|
||||
* ssp0 and spi1 are shared pins;
|
||||
* enable one in your board dts, as needed.
|
||||
*/
|
||||
ssp0: ssp@20084000 {
|
||||
ssp0: spi@20084000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x20084000 0x1000>;
|
||||
interrupts = <20 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@@ -199,7 +199,7 @@
|
||||
* ssp1 and spi2 are shared pins;
|
||||
* enable one in your board dts, as needed.
|
||||
*/
|
||||
ssp1: ssp@2008c000 {
|
||||
ssp1: spi@2008c000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x2008c000 0x1000>;
|
||||
interrupts = <21 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
compatible = "amlogic,meson8-clkc";
|
||||
reg = <0x8000 0x4>, <0x4000 0x460>;
|
||||
reg = <0x8000 0x4>, <0x4000 0x400>;
|
||||
};
|
||||
|
||||
pwm_ef: pwm@86c0 {
|
||||
|
||||
@@ -121,7 +121,7 @@
|
||||
#clock-cells = <1>;
|
||||
#reset-cells = <1>;
|
||||
compatible = "amlogic,meson8b-clkc";
|
||||
reg = <0x8000 0x4>, <0x4000 0x460>;
|
||||
reg = <0x8000 0x4>, <0x4000 0x400>;
|
||||
};
|
||||
|
||||
reset: reset-controller@4404 {
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
|
||||
aliases {
|
||||
display0 = &lcd;
|
||||
display1 = &tv0;
|
||||
};
|
||||
|
||||
gpio-keys {
|
||||
@@ -71,7 +72,7 @@
|
||||
#sound-dai-cells = <0>;
|
||||
};
|
||||
|
||||
spi_lcd {
|
||||
spi_lcd: spi_lcd {
|
||||
compatible = "spi-gpio";
|
||||
#address-cells = <0x1>;
|
||||
#size-cells = <0x0>;
|
||||
@@ -123,7 +124,7 @@
|
||||
};
|
||||
|
||||
tv0: connector {
|
||||
compatible = "svideo-connector";
|
||||
compatible = "composite-video-connector";
|
||||
label = "tv";
|
||||
|
||||
port {
|
||||
@@ -135,7 +136,7 @@
|
||||
|
||||
tv_amp: opa362 {
|
||||
compatible = "ti,opa362";
|
||||
enable-gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>;
|
||||
enable-gpios = <&gpio1 23 GPIO_ACTIVE_HIGH>; /* GPIO_23 to enable video out amplifier */
|
||||
|
||||
ports {
|
||||
#address-cells = <1>;
|
||||
@@ -274,6 +275,13 @@
|
||||
OMAP3_CORE1_IOPAD(0x2134, PIN_INPUT_PULLUP | MUX_MODE4) /* gpio112 */
|
||||
>;
|
||||
};
|
||||
|
||||
penirq_pins: pinmux_penirq_pins {
|
||||
pinctrl-single,pins = <
|
||||
/* here we could enable to wakeup the cpu from suspend by a pen touch */
|
||||
OMAP3_CORE1_IOPAD(0x2194, PIN_INPUT_PULLUP | MUX_MODE4) /* gpio160 */
|
||||
>;
|
||||
};
|
||||
};
|
||||
|
||||
&omap3_pmx_core2 {
|
||||
@@ -411,10 +419,19 @@
|
||||
tsc2007@48 {
|
||||
compatible = "ti,tsc2007";
|
||||
reg = <0x48>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&penirq_pins>;
|
||||
interrupt-parent = <&gpio6>;
|
||||
interrupts = <0 IRQ_TYPE_EDGE_FALLING>; /* GPIO_160 */
|
||||
gpios = <&gpio6 0 GPIO_ACTIVE_LOW>;
|
||||
gpios = <&gpio6 0 GPIO_ACTIVE_LOW>; /* GPIO_160 */
|
||||
ti,x-plate-ohms = <600>;
|
||||
touchscreen-size-x = <480>;
|
||||
touchscreen-size-y = <640>;
|
||||
touchscreen-max-pressure = <1000>;
|
||||
touchscreen-fuzz-x = <3>;
|
||||
touchscreen-fuzz-y = <8>;
|
||||
touchscreen-fuzz-pressure = <10>;
|
||||
touchscreen-inverted-y;
|
||||
};
|
||||
|
||||
/* RFID EEPROM */
|
||||
@@ -520,6 +537,12 @@
|
||||
regulator-max-microvolt = <3150000>;
|
||||
};
|
||||
|
||||
/* Needed to power the DPI pins */
|
||||
|
||||
&vpll2 {
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
&dss {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = < &dss_dpi_pins >;
|
||||
@@ -540,10 +563,14 @@
|
||||
|
||||
vdda-supply = <&vdac>;
|
||||
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
|
||||
port {
|
||||
reg = <0>;
|
||||
venc_out: endpoint {
|
||||
remote-endpoint = <&opa_in>;
|
||||
ti,channels = <2>;
|
||||
ti,channels = <1>;
|
||||
ti,invert-polarity;
|
||||
};
|
||||
};
|
||||
@@ -587,22 +614,22 @@
|
||||
|
||||
bootloaders@80000 {
|
||||
label = "U-Boot";
|
||||
reg = <0x80000 0x1e0000>;
|
||||
reg = <0x80000 0x1c0000>;
|
||||
};
|
||||
|
||||
bootloaders_env@260000 {
|
||||
bootloaders_env@240000 {
|
||||
label = "U-Boot Env";
|
||||
reg = <0x260000 0x20000>;
|
||||
reg = <0x240000 0x40000>;
|
||||
};
|
||||
|
||||
kernel@280000 {
|
||||
label = "Kernel";
|
||||
reg = <0x280000 0x400000>;
|
||||
reg = <0x280000 0x600000>;
|
||||
};
|
||||
|
||||
filesystem@680000 {
|
||||
filesystem@880000 {
|
||||
label = "File System";
|
||||
reg = <0x680000 0xf980000>;
|
||||
reg = <0x880000 0>; /* 0 = MTDPART_SIZ_FULL */
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
&i2c {
|
||||
status = "okay";
|
||||
|
||||
rtc {
|
||||
rtc@32 {
|
||||
compatible = "ricoh,rs5c372a";
|
||||
reg = <0x32>;
|
||||
};
|
||||
|
||||
@@ -80,6 +80,10 @@
|
||||
#pwm-cells = <1>;
|
||||
clocks = <&clks CLK_PWM1>;
|
||||
};
|
||||
|
||||
rtc@40900000 {
|
||||
clocks = <&clks CLK_OSC32k768>;
|
||||
};
|
||||
};
|
||||
|
||||
timer@40a00000 {
|
||||
|
||||
@@ -71,7 +71,7 @@
|
||||
clocks = <&clks CLK_PWM1>;
|
||||
};
|
||||
|
||||
pwri2c: i2c@40f000180 {
|
||||
pwri2c: i2c@40f00180 {
|
||||
compatible = "mrvl,pxa-i2c";
|
||||
reg = <0x40f00180 0x24>;
|
||||
interrupts = <6>;
|
||||
@@ -113,6 +113,10 @@
|
||||
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
rtc@40900000 {
|
||||
clocks = <&clks CLK_OSC32k768>;
|
||||
};
|
||||
};
|
||||
|
||||
clocks {
|
||||
|
||||
@@ -234,7 +234,7 @@
|
||||
|
||||
saw0: regulator@b089000 {
|
||||
compatible = "qcom,saw2";
|
||||
reg = <0x02089000 0x1000>, <0x0b009000 0x1000>;
|
||||
reg = <0x0b089000 0x1000>, <0x0b009000 0x1000>;
|
||||
regulator;
|
||||
};
|
||||
|
||||
|
||||
@@ -750,7 +750,7 @@
|
||||
/* no rts / cts for uart2 */
|
||||
};
|
||||
|
||||
spi {
|
||||
spi-pins {
|
||||
spi_txd:spi-txd {
|
||||
rockchip,pins = <1 29 RK_FUNC_3 &pcfg_pull_default>;
|
||||
};
|
||||
|
||||
@@ -130,6 +130,8 @@
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
gpio = <&gpio3 RK_PA1 GPIO_ACTIVE_LOW>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_pwr>;
|
||||
startup-delay-us = <100000>;
|
||||
vin-supply = <&vcc_io>;
|
||||
};
|
||||
@@ -348,6 +350,12 @@
|
||||
};
|
||||
};
|
||||
|
||||
sd0 {
|
||||
sdmmc_pwr: sdmmc-pwr {
|
||||
rockchip,pins = <RK_GPIO3 1 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
usb {
|
||||
host_vbus_drv: host-vbus-drv {
|
||||
rockchip,pins = <0 3 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
|
||||
@@ -88,7 +88,7 @@
|
||||
status = "okay";
|
||||
clock-frequency = <100000>;
|
||||
|
||||
adxl345: adxl345@0 {
|
||||
adxl345: adxl345@53 {
|
||||
compatible = "adi,adxl345";
|
||||
reg = <0x53>;
|
||||
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
<0xa0410100 0x100>;
|
||||
};
|
||||
|
||||
scu@a04100000 {
|
||||
scu@a0410000 {
|
||||
compatible = "arm,cortex-a9-scu";
|
||||
reg = <0xa0410000 0x100>;
|
||||
};
|
||||
@@ -878,7 +878,7 @@
|
||||
power-domains = <&pm_domains DOMAIN_VAPE>;
|
||||
};
|
||||
|
||||
ssp@80002000 {
|
||||
spi@80002000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x80002000 0x1000>;
|
||||
interrupts = <GIC_SPI 14 IRQ_TYPE_LEVEL_HIGH>;
|
||||
@@ -892,7 +892,7 @@
|
||||
power-domains = <&pm_domains DOMAIN_VAPE>;
|
||||
};
|
||||
|
||||
ssp@80003000 {
|
||||
spi@80003000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x80003000 0x1000>;
|
||||
interrupts = <GIC_SPI 52 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
@@ -607,16 +607,20 @@
|
||||
|
||||
mcde {
|
||||
lcd_default_mode: lcd_default {
|
||||
default_mux {
|
||||
default_mux1 {
|
||||
/* Mux in VSI0 and all the data lines */
|
||||
function = "lcd";
|
||||
groups =
|
||||
"lcdvsi0_a_1", /* VSI0 for LCD */
|
||||
"lcd_d0_d7_a_1", /* Data lines */
|
||||
"lcd_d8_d11_a_1", /* TV-out */
|
||||
"lcdaclk_b_1", /* Clock line for TV-out */
|
||||
"lcdvsi1_a_1"; /* VSI1 for HDMI */
|
||||
};
|
||||
default_mux2 {
|
||||
function = "lcda";
|
||||
groups =
|
||||
"lcdaclk_b_1"; /* Clock line for TV-out */
|
||||
};
|
||||
default_cfg1 {
|
||||
pins =
|
||||
"GPIO68_E1", /* VSI0 */
|
||||
|
||||
@@ -57,7 +57,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
ssp@80002000 {
|
||||
spi@80002000 {
|
||||
/*
|
||||
* On the first generation boards, this SSP/SPI port was connected
|
||||
* to the AB8500.
|
||||
|
||||
@@ -376,7 +376,7 @@
|
||||
pinctrl-1 = <&i2c3_sleep_mode>;
|
||||
};
|
||||
|
||||
ssp@80002000 {
|
||||
spi@80002000 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&ssp0_snowball_mode>;
|
||||
};
|
||||
|
||||
@@ -442,7 +442,7 @@
|
||||
dma-names = "rx";
|
||||
};
|
||||
|
||||
spi: ssp@c0006000 {
|
||||
spi: spi@c0006000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0xc0006000 0x1000>;
|
||||
interrupt-parent = <&vica>;
|
||||
|
||||
@@ -524,10 +524,10 @@
|
||||
gpio-keys {
|
||||
compatible = "gpio-keys";
|
||||
|
||||
power {
|
||||
label = "Power";
|
||||
wakeup {
|
||||
label = "Wakeup";
|
||||
gpios = <&gpio TEGRA_GPIO(J, 7) GPIO_ACTIVE_LOW>;
|
||||
linux,code = <KEY_POWER>;
|
||||
linux,code = <KEY_WAKEUP>;
|
||||
wakeup-source;
|
||||
};
|
||||
};
|
||||
|
||||
@@ -166,14 +166,14 @@
|
||||
|
||||
/* Apalis MMC1 */
|
||||
sdmmc3_clk_pa6 {
|
||||
nvidia,pins = "sdmmc3_clk_pa6",
|
||||
"sdmmc3_cmd_pa7";
|
||||
nvidia,pins = "sdmmc3_clk_pa6";
|
||||
nvidia,function = "sdmmc3";
|
||||
nvidia,pull = <TEGRA_PIN_PULL_NONE>;
|
||||
nvidia,tristate = <TEGRA_PIN_DISABLE>;
|
||||
};
|
||||
sdmmc3_dat0_pb7 {
|
||||
nvidia,pins = "sdmmc3_dat0_pb7",
|
||||
nvidia,pins = "sdmmc3_cmd_pa7",
|
||||
"sdmmc3_dat0_pb7",
|
||||
"sdmmc3_dat1_pb6",
|
||||
"sdmmc3_dat2_pb5",
|
||||
"sdmmc3_dat3_pb4",
|
||||
|
||||
@@ -840,7 +840,7 @@
|
||||
nvidia,elastic-limit = <16>;
|
||||
nvidia,term-range-adj = <6>;
|
||||
nvidia,xcvr-setup = <51>;
|
||||
nvidia.xcvr-setup-use-fuses;
|
||||
nvidia,xcvr-setup-use-fuses;
|
||||
nvidia,xcvr-lsfslew = <1>;
|
||||
nvidia,xcvr-lsrslew = <1>;
|
||||
nvidia,xcvr-hsslew = <32>;
|
||||
@@ -877,7 +877,7 @@
|
||||
nvidia,elastic-limit = <16>;
|
||||
nvidia,term-range-adj = <6>;
|
||||
nvidia,xcvr-setup = <51>;
|
||||
nvidia.xcvr-setup-use-fuses;
|
||||
nvidia,xcvr-setup-use-fuses;
|
||||
nvidia,xcvr-lsfslew = <2>;
|
||||
nvidia,xcvr-lsrslew = <2>;
|
||||
nvidia,xcvr-hsslew = <32>;
|
||||
@@ -913,7 +913,7 @@
|
||||
nvidia,elastic-limit = <16>;
|
||||
nvidia,term-range-adj = <6>;
|
||||
nvidia,xcvr-setup = <51>;
|
||||
nvidia.xcvr-setup-use-fuses;
|
||||
nvidia,xcvr-setup-use-fuses;
|
||||
nvidia,xcvr-lsfslew = <2>;
|
||||
nvidia,xcvr-lsrslew = <2>;
|
||||
nvidia,xcvr-hsslew = <32>;
|
||||
|
||||
@@ -304,7 +304,7 @@
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
|
||||
ssp@101f4000 {
|
||||
spi@101f4000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x101f4000 0x1000>;
|
||||
interrupts = <11>;
|
||||
|
||||
@@ -236,7 +236,7 @@ static void __exit crc32_pmull_mod_exit(void)
|
||||
ARRAY_SIZE(crc32_pmull_algs));
|
||||
}
|
||||
|
||||
static const struct cpu_feature crc32_cpu_feature[] = {
|
||||
static const struct cpu_feature __maybe_unused crc32_cpu_feature[] = {
|
||||
{ cpu_feature(CRC32) }, { cpu_feature(PMULL) }, { }
|
||||
};
|
||||
MODULE_DEVICE_TABLE(cpu, crc32_cpu_feature);
|
||||
|
||||
@@ -604,6 +604,28 @@ static void __init imx6_pm_common_init(const struct imx6_pm_socdata
|
||||
IMX6Q_GPR1_GINT);
|
||||
}
|
||||
|
||||
static void imx6_pm_stby_poweroff(void)
|
||||
{
|
||||
imx6_set_lpm(STOP_POWER_OFF);
|
||||
imx6q_suspend_finish(0);
|
||||
|
||||
mdelay(1000);
|
||||
|
||||
pr_emerg("Unable to poweroff system\n");
|
||||
}
|
||||
|
||||
static int imx6_pm_stby_poweroff_probe(void)
|
||||
{
|
||||
if (pm_power_off) {
|
||||
pr_warn("%s: pm_power_off already claimed %p %pf!\n",
|
||||
__func__, pm_power_off, pm_power_off);
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
pm_power_off = imx6_pm_stby_poweroff;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void __init imx6_pm_ccm_init(const char *ccm_compat)
|
||||
{
|
||||
struct device_node *np;
|
||||
@@ -620,6 +642,9 @@ void __init imx6_pm_ccm_init(const char *ccm_compat)
|
||||
val = readl_relaxed(ccm_base + CLPCR);
|
||||
val &= ~BM_CLPCR_LPM;
|
||||
writel_relaxed(val, ccm_base + CLPCR);
|
||||
|
||||
if (of_property_read_bool(np, "fsl,pmic-stby-poweroff"))
|
||||
imx6_pm_stby_poweroff_probe();
|
||||
}
|
||||
|
||||
void __init imx6q_pm_init(void)
|
||||
|
||||
@@ -126,9 +126,9 @@
|
||||
|
||||
®_dcdc1 {
|
||||
regulator-always-on;
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
regulator-name = "vcc-3v";
|
||||
regulator-min-microvolt = <3300000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-name = "vcc-3v3";
|
||||
};
|
||||
|
||||
®_dcdc2 {
|
||||
|
||||
@@ -120,10 +120,14 @@
|
||||
|
||||
/* DCDC3 is polyphased with DCDC2 */
|
||||
|
||||
/*
|
||||
* The board uses DDR3L DRAM chips. 1.36V is the closest to the nominal
|
||||
* 1.35V that the PMIC can drive.
|
||||
*/
|
||||
®_dcdc5 {
|
||||
regulator-always-on;
|
||||
regulator-min-microvolt = <1500000>;
|
||||
regulator-max-microvolt = <1500000>;
|
||||
regulator-min-microvolt = <1360000>;
|
||||
regulator-max-microvolt = <1360000>;
|
||||
regulator-name = "vcc-ddr3";
|
||||
};
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
clock-names = "uartclk", "apb_pclk";
|
||||
};
|
||||
|
||||
spi0: ssp@e1020000 {
|
||||
spi0: spi@e1020000 {
|
||||
status = "disabled";
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0 0xe1020000 0 0x1000>;
|
||||
@@ -117,7 +117,7 @@
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
|
||||
spi1: ssp@e1030000 {
|
||||
spi1: spi@e1030000 {
|
||||
status = "disabled";
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0 0xe1030000 0 0x1000>;
|
||||
|
||||
@@ -413,7 +413,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
spi_pins: spi {
|
||||
spi_pins: spi-pins {
|
||||
mux {
|
||||
groups = "spi_miso",
|
||||
"spi_mosi",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
|
||||
/ {
|
||||
compatible = "libretech,cc", "amlogic,s905x", "amlogic,meson-gxl";
|
||||
model = "Libre Technology CC";
|
||||
model = "Libre Computer Board AML-S905X-CC";
|
||||
|
||||
aliases {
|
||||
serial0 = &uart_AO;
|
||||
|
||||
@@ -310,7 +310,7 @@
|
||||
};
|
||||
};
|
||||
|
||||
spi_pins: spi {
|
||||
spi_pins: spi-pins {
|
||||
mux {
|
||||
groups = "spi_miso",
|
||||
"spi_mosi",
|
||||
|
||||
@@ -168,14 +168,14 @@
|
||||
clock-names = "apb_pclk";
|
||||
status="disabled";
|
||||
};
|
||||
spi0: ssp@fe800000 {
|
||||
spi0: spi@fe800000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x0 0xfe800000 0x1000>;
|
||||
interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk_bus>;
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
spi1: ssp@fe900000 {
|
||||
spi1: spi@fe900000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x0 0xfe900000 0x1000>;
|
||||
interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
@@ -168,14 +168,14 @@
|
||||
clock-names = "apb_pclk";
|
||||
status="disabled";
|
||||
};
|
||||
spi0: ssp@fe800000 {
|
||||
spi0: spi@fe800000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x0 0xfe800000 0x1000>;
|
||||
interrupts = <GIC_SPI 3 IRQ_TYPE_LEVEL_HIGH>;
|
||||
clocks = <&clk_bus>;
|
||||
clock-names = "apb_pclk";
|
||||
};
|
||||
spi1: ssp@fe900000 {
|
||||
spi1: spi@fe900000 {
|
||||
compatible = "arm,pl022", "arm,primecell";
|
||||
reg = <0x0 0xfe900000 0x1000>;
|
||||
interrupts = <GIC_SPI 4 IRQ_TYPE_LEVEL_HIGH>;
|
||||
|
||||
@@ -282,6 +282,7 @@
|
||||
status = "okay";
|
||||
bus-width = <8>;
|
||||
non-removable;
|
||||
vqmmc-supply = <&vdd_1v8>;
|
||||
};
|
||||
|
||||
clocks {
|
||||
|
||||
@@ -113,6 +113,19 @@
|
||||
vin-supply = <&vcc_1v8>;
|
||||
};
|
||||
|
||||
vcc3v0_sd: vcc3v0-sd {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio0 RK_PA1 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc0_pwr_h>;
|
||||
regulator-always-on;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
regulator-min-microvolt = <3000000>;
|
||||
regulator-name = "vcc3v0_sd";
|
||||
vin-supply = <&vcc3v3_sys>;
|
||||
};
|
||||
|
||||
vcc3v3_sys: vcc3v3-sys {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "vcc3v3_sys";
|
||||
@@ -136,7 +149,7 @@
|
||||
vcc5v0_host: vcc5v0-host-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
enable-active-high;
|
||||
gpio = <&gpio1 RK_PD1 GPIO_ACTIVE_HIGH>;
|
||||
gpio = <&gpio4 RK_PD1 GPIO_ACTIVE_HIGH>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&vcc5v0_host_en>;
|
||||
regulator-name = "vcc5v0_host";
|
||||
@@ -315,7 +328,7 @@
|
||||
regulator-always-on;
|
||||
regulator-boot-on;
|
||||
regulator-min-microvolt = <1800000>;
|
||||
regulator-max-microvolt = <3000000>;
|
||||
regulator-max-microvolt = <3300000>;
|
||||
regulator-state-mem {
|
||||
regulator-on-in-suspend;
|
||||
regulator-suspend-microvolt = <3000000>;
|
||||
@@ -490,6 +503,13 @@
|
||||
};
|
||||
};
|
||||
|
||||
sd {
|
||||
sdmmc0_pwr_h: sdmmc0-pwr-h {
|
||||
rockchip,pins =
|
||||
<RK_GPIO0 RK_PA1 RK_FUNC_GPIO &pcfg_pull_none>;
|
||||
};
|
||||
};
|
||||
|
||||
usb2 {
|
||||
vcc5v0_host_en: vcc5v0-host-en {
|
||||
rockchip,pins =
|
||||
@@ -537,6 +557,7 @@
|
||||
};
|
||||
|
||||
&sdmmc {
|
||||
broken-cd;
|
||||
bus-width = <4>;
|
||||
cap-mmc-highspeed;
|
||||
cap-sd-highspeed;
|
||||
@@ -545,6 +566,7 @@
|
||||
max-frequency = <150000000>;
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&sdmmc_clk &sdmmc_cmd &sdmmc_cd &sdmmc_bus4>;
|
||||
vmmc-supply = <&vcc3v0_sd>;
|
||||
vqmmc-supply = <&vcc_sdio>;
|
||||
status = "okay";
|
||||
};
|
||||
|
||||
@@ -5,9 +5,8 @@
|
||||
#include <bcm47xx_board.h>
|
||||
#include <bcm47xx.h>
|
||||
|
||||
static void __init bcm47xx_workarounds_netgear_wnr3500l(void)
|
||||
static void __init bcm47xx_workarounds_enable_usb_power(int usb_power)
|
||||
{
|
||||
const int usb_power = 12;
|
||||
int err;
|
||||
|
||||
err = gpio_request_one(usb_power, GPIOF_OUT_INIT_HIGH, "usb_power");
|
||||
@@ -23,7 +22,10 @@ void __init bcm47xx_workarounds(void)
|
||||
|
||||
switch (board) {
|
||||
case BCM47XX_BOARD_NETGEAR_WNR3500L:
|
||||
bcm47xx_workarounds_netgear_wnr3500l();
|
||||
bcm47xx_workarounds_enable_usb_power(12);
|
||||
break;
|
||||
case BCM47XX_BOARD_NETGEAR_WNDR3400_V3:
|
||||
bcm47xx_workarounds_enable_usb_power(21);
|
||||
break;
|
||||
default:
|
||||
/* No workaround(s) needed */
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
#define BCM6368_RESET_DSL 0
|
||||
#define BCM6368_RESET_SAR SOFTRESET_6368_SAR_MASK
|
||||
#define BCM6368_RESET_EPHY SOFTRESET_6368_EPHY_MASK
|
||||
#define BCM6368_RESET_ENETSW 0
|
||||
#define BCM6368_RESET_ENETSW SOFTRESET_6368_ENETSW_MASK
|
||||
#define BCM6368_RESET_PCM SOFTRESET_6368_PCM_MASK
|
||||
#define BCM6368_RESET_MPI SOFTRESET_6368_MPI_MASK
|
||||
#define BCM6368_RESET_PCIE 0
|
||||
|
||||
@@ -12,11 +12,11 @@
|
||||
#include <asm/stacktrace.h>
|
||||
|
||||
/* Maximum physical address we can use pages from */
|
||||
#define KEXEC_SOURCE_MEMORY_LIMIT (0x20000000)
|
||||
#define KEXEC_SOURCE_MEMORY_LIMIT (-1UL)
|
||||
/* Maximum address we can reach in physical address mode */
|
||||
#define KEXEC_DESTINATION_MEMORY_LIMIT (0x20000000)
|
||||
#define KEXEC_DESTINATION_MEMORY_LIMIT (-1UL)
|
||||
/* Maximum address we can use for the control code buffer */
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (0x20000000)
|
||||
#define KEXEC_CONTROL_MEMORY_LIMIT (-1UL)
|
||||
/* Reserve 3*4096 bytes for board-specific info */
|
||||
#define KEXEC_CONTROL_PAGE_SIZE (4096 + 3*4096)
|
||||
|
||||
|
||||
@@ -959,12 +959,11 @@ void __init txx9_sramc_init(struct resource *r)
|
||||
goto exit_put;
|
||||
err = sysfs_create_bin_file(&dev->dev.kobj, &dev->bindata_attr);
|
||||
if (err) {
|
||||
device_unregister(&dev->dev);
|
||||
iounmap(dev->base);
|
||||
kfree(dev);
|
||||
device_unregister(&dev->dev);
|
||||
}
|
||||
return;
|
||||
exit_put:
|
||||
iounmap(dev->base);
|
||||
put_device(&dev->dev);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
#include <types.h>
|
||||
#include <string.h>
|
||||
|
||||
#define INT_MAX ((int)(~0U>>1))
|
||||
|
||||
#include "of.h"
|
||||
|
||||
typedef u32 uint32_t;
|
||||
|
||||
@@ -20,11 +20,6 @@
|
||||
#include <linux/io.h>
|
||||
#include <asm/opal.h>
|
||||
|
||||
/*
|
||||
* For static allocation of some of the structures.
|
||||
*/
|
||||
#define IMC_MAX_PMUS 32
|
||||
|
||||
/*
|
||||
* Compatibility macros for IMC devices
|
||||
*/
|
||||
@@ -125,4 +120,5 @@ enum {
|
||||
extern int init_imc_pmu(struct device_node *parent,
|
||||
struct imc_pmu *pmu_ptr, int pmu_id);
|
||||
extern void thread_imc_disable(void);
|
||||
extern int get_max_nest_dev(void);
|
||||
#endif /* __ASM_POWERPC_IMC_PMU_H */
|
||||
|
||||
@@ -234,7 +234,7 @@ do { \
|
||||
({ \
|
||||
long __gu_err; \
|
||||
__long_type(*(ptr)) __gu_val; \
|
||||
const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
if (!is_kernel_addr((unsigned long)__gu_addr)) \
|
||||
might_fault(); \
|
||||
@@ -248,7 +248,7 @@ do { \
|
||||
({ \
|
||||
long __gu_err = -EFAULT; \
|
||||
__long_type(*(ptr)) __gu_val = 0; \
|
||||
const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
might_fault(); \
|
||||
if (access_ok(VERIFY_READ, __gu_addr, (size))) { \
|
||||
barrier_nospec(); \
|
||||
@@ -262,7 +262,7 @@ do { \
|
||||
({ \
|
||||
long __gu_err; \
|
||||
__long_type(*(ptr)) __gu_val; \
|
||||
const __typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__typeof__(*(ptr)) __user *__gu_addr = (ptr); \
|
||||
__chk_user_ptr(ptr); \
|
||||
barrier_nospec(); \
|
||||
__get_user_size(__gu_val, __gu_addr, (size), __gu_err); \
|
||||
|
||||
@@ -785,9 +785,9 @@ dma_addr_t iommu_map_page(struct device *dev, struct iommu_table *tbl,
|
||||
|
||||
vaddr = page_address(page) + offset;
|
||||
uaddr = (unsigned long)vaddr;
|
||||
npages = iommu_num_pages(uaddr, size, IOMMU_PAGE_SIZE(tbl));
|
||||
|
||||
if (tbl) {
|
||||
npages = iommu_num_pages(uaddr, size, IOMMU_PAGE_SIZE(tbl));
|
||||
align = 0;
|
||||
if (tbl->it_page_shift < PAGE_SHIFT && size >= PAGE_SIZE &&
|
||||
((unsigned long)vaddr & ~PAGE_MASK) == 0)
|
||||
|
||||
@@ -984,6 +984,7 @@ int rtas_ibm_suspend_me(u64 handle)
|
||||
goto out;
|
||||
}
|
||||
|
||||
cpu_hotplug_disable();
|
||||
stop_topology_update();
|
||||
|
||||
/* Call function on all CPUs. One of us will make the
|
||||
@@ -998,6 +999,7 @@ int rtas_ibm_suspend_me(u64 handle)
|
||||
printk(KERN_ERR "Error doing global join\n");
|
||||
|
||||
start_topology_update();
|
||||
cpu_hotplug_enable();
|
||||
|
||||
/* Take down CPUs not online prior to suspend */
|
||||
cpuret = rtas_offline_cpus_mask(offline_mask);
|
||||
|
||||
@@ -37,6 +37,7 @@ data_page_branch:
|
||||
mtlr r0
|
||||
addi r3, r3, __kernel_datapage_offset-data_page_branch
|
||||
lwz r0,0(r3)
|
||||
.cfi_restore lr
|
||||
add r3,r0,r3
|
||||
blr
|
||||
.cfi_endproc
|
||||
|
||||
@@ -139,6 +139,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
*/
|
||||
99:
|
||||
li r0,__NR_clock_gettime
|
||||
.cfi_restore lr
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
|
||||
@@ -37,6 +37,7 @@ data_page_branch:
|
||||
mtlr r0
|
||||
addi r3, r3, __kernel_datapage_offset-data_page_branch
|
||||
lwz r0,0(r3)
|
||||
.cfi_restore lr
|
||||
add r3,r0,r3
|
||||
blr
|
||||
.cfi_endproc
|
||||
|
||||
@@ -124,6 +124,7 @@ V_FUNCTION_BEGIN(__kernel_clock_gettime)
|
||||
*/
|
||||
99:
|
||||
li r0,__NR_clock_gettime
|
||||
.cfi_restore lr
|
||||
sc
|
||||
blr
|
||||
.cfi_endproc
|
||||
|
||||
@@ -315,7 +315,7 @@ void slb_initialize(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
get_paca()->stab_rr = SLB_NUM_BOLTED;
|
||||
get_paca()->stab_rr = SLB_NUM_BOLTED - 1;
|
||||
|
||||
lflags = SLB_VSID_KERNEL | linear_llp;
|
||||
vflags = SLB_VSID_KERNEL | vmalloc_llp;
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
*/
|
||||
static DEFINE_MUTEX(nest_init_lock);
|
||||
static DEFINE_PER_CPU(struct imc_pmu_ref *, local_nest_imc_refc);
|
||||
static struct imc_pmu *per_nest_pmu_arr[IMC_MAX_PMUS];
|
||||
static struct imc_pmu **per_nest_pmu_arr;
|
||||
static cpumask_t nest_imc_cpumask;
|
||||
struct imc_pmu_ref *nest_imc_refc;
|
||||
static int nest_pmus;
|
||||
@@ -286,13 +286,14 @@ static struct imc_pmu_ref *get_nest_pmu_ref(int cpu)
|
||||
static void nest_change_cpu_context(int old_cpu, int new_cpu)
|
||||
{
|
||||
struct imc_pmu **pn = per_nest_pmu_arr;
|
||||
int i;
|
||||
|
||||
if (old_cpu < 0 || new_cpu < 0)
|
||||
return;
|
||||
|
||||
for (i = 0; *pn && i < IMC_MAX_PMUS; i++, pn++)
|
||||
while (*pn) {
|
||||
perf_pmu_migrate_context(&(*pn)->pmu, old_cpu, new_cpu);
|
||||
pn++;
|
||||
}
|
||||
}
|
||||
|
||||
static int ppc_nest_imc_cpu_offline(unsigned int cpu)
|
||||
@@ -1188,6 +1189,7 @@ static void imc_common_cpuhp_mem_free(struct imc_pmu *pmu_ptr)
|
||||
if (nest_pmus == 1) {
|
||||
cpuhp_remove_state(CPUHP_AP_PERF_POWERPC_NEST_IMC_ONLINE);
|
||||
kfree(nest_imc_refc);
|
||||
kfree(per_nest_pmu_arr);
|
||||
}
|
||||
|
||||
if (nest_pmus > 0)
|
||||
@@ -1236,6 +1238,13 @@ static int imc_mem_init(struct imc_pmu *pmu_ptr, struct device_node *parent,
|
||||
return -ENOMEM;
|
||||
|
||||
/* Needed for hotplug/migration */
|
||||
if (!per_nest_pmu_arr) {
|
||||
per_nest_pmu_arr = kcalloc(get_max_nest_dev() + 1,
|
||||
sizeof(struct imc_pmu *),
|
||||
GFP_KERNEL);
|
||||
if (!per_nest_pmu_arr)
|
||||
return -ENOMEM;
|
||||
}
|
||||
per_nest_pmu_arr[pmu_index] = pmu_ptr;
|
||||
break;
|
||||
case IMC_DOMAIN_CORE:
|
||||
@@ -1318,6 +1327,8 @@ int init_imc_pmu(struct device_node *parent, struct imc_pmu *pmu_ptr, int pmu_id
|
||||
ret = nest_pmu_cpumask_init();
|
||||
if (ret) {
|
||||
mutex_unlock(&nest_init_lock);
|
||||
kfree(nest_imc_refc);
|
||||
kfree(per_nest_pmu_arr);
|
||||
goto err_free;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -159,6 +159,22 @@ static void disable_core_pmu_counters(void)
|
||||
put_online_cpus();
|
||||
}
|
||||
|
||||
int get_max_nest_dev(void)
|
||||
{
|
||||
struct device_node *node;
|
||||
u32 pmu_units = 0, type;
|
||||
|
||||
for_each_compatible_node(node, NULL, IMC_DTB_UNIT_COMPAT) {
|
||||
if (of_property_read_u32(node, "type", &type))
|
||||
continue;
|
||||
|
||||
if (type == IMC_TYPE_CHIP)
|
||||
pmu_units++;
|
||||
}
|
||||
|
||||
return pmu_units;
|
||||
}
|
||||
|
||||
static int opal_imc_counters_probe(struct platform_device *pdev)
|
||||
{
|
||||
struct device_node *imc_dev = pdev->dev.of_node;
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/efi.h>
|
||||
#include <linux/types.h>
|
||||
#include <asm/hypervisor.h>
|
||||
#include <asm/hyperv.h>
|
||||
@@ -101,6 +102,22 @@ static int hv_cpu_init(unsigned int cpu)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init hv_pci_init(void)
|
||||
{
|
||||
int gen2vm = efi_enabled(EFI_BOOT);
|
||||
|
||||
/*
|
||||
* For Generation-2 VM, we exit from pci_arch_init() by returning 0.
|
||||
* The purpose is to suppress the harmless warning:
|
||||
* "PCI: Fatal: No config space access function found"
|
||||
*/
|
||||
if (gen2vm)
|
||||
return 0;
|
||||
|
||||
/* For Generation-1 VM, we'll proceed in pci_arch_init(). */
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is to be invoked early in the boot sequence after the
|
||||
* hypervisor has been detected.
|
||||
@@ -154,6 +171,8 @@ void hyperv_init(void)
|
||||
|
||||
hyper_alloc_mmu();
|
||||
|
||||
x86_init.pci.arch_init = hv_pci_init;
|
||||
|
||||
/*
|
||||
* Register Hyper-V specific clocksource.
|
||||
*/
|
||||
|
||||
@@ -1066,6 +1066,9 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
|
||||
memset(&c->x86_capability, 0, sizeof c->x86_capability);
|
||||
c->extended_cpuid_level = 0;
|
||||
|
||||
if (!have_cpuid_p())
|
||||
identify_cpu_without_cpuid(c);
|
||||
|
||||
/* cyrix could have cpuid enabled via c_identify()*/
|
||||
if (have_cpuid_p()) {
|
||||
cpu_detect(c);
|
||||
@@ -1082,7 +1085,6 @@ static void __init early_identify_cpu(struct cpuinfo_x86 *c)
|
||||
if (this_cpu->c_bsp_init)
|
||||
this_cpu->c_bsp_init(c);
|
||||
} else {
|
||||
identify_cpu_without_cpuid(c);
|
||||
setup_clear_cpu_cap(X86_FEATURE_CPUID);
|
||||
}
|
||||
|
||||
|
||||
@@ -437,7 +437,7 @@ static void cyrix_identify(struct cpuinfo_x86 *c)
|
||||
/* enable MAPEN */
|
||||
setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10);
|
||||
/* enable cpuid */
|
||||
setCx86_old(CX86_CCR4, getCx86_old(CX86_CCR4) | 0x80);
|
||||
setCx86(CX86_CCR4, getCx86(CX86_CCR4) | 0x80);
|
||||
/* disable MAPEN */
|
||||
setCx86(CX86_CCR3, ccr3);
|
||||
local_irq_restore(flags);
|
||||
|
||||
@@ -108,6 +108,9 @@ static void setup_inj_struct(struct mce *m)
|
||||
memset(m, 0, sizeof(struct mce));
|
||||
|
||||
m->cpuvendor = boot_cpu_data.x86_vendor;
|
||||
m->time = ktime_get_real_seconds();
|
||||
m->cpuid = cpuid_eax(1);
|
||||
m->microcode = boot_cpu_data.microcode;
|
||||
}
|
||||
|
||||
/* Update fake mce registers on current CPU. */
|
||||
@@ -576,6 +579,9 @@ static int inj_bank_set(void *data, u64 val)
|
||||
m->bank = val;
|
||||
do_inject();
|
||||
|
||||
/* Reset injection struct */
|
||||
setup_inj_struct(&i_mce);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -987,7 +987,7 @@ arch_uretprobe_hijack_return_addr(unsigned long trampoline_vaddr, struct pt_regs
|
||||
pr_err("uprobe: return address clobbered: pid=%d, %%sp=%#lx, "
|
||||
"%%ip=%#lx\n", current->pid, regs->sp, regs->ip);
|
||||
|
||||
force_sig_info(SIGSEGV, SEND_SIG_FORCED, current);
|
||||
force_sig(SIGSEGV, current);
|
||||
}
|
||||
|
||||
return -1;
|
||||
|
||||
@@ -4468,7 +4468,7 @@ static void ept_load_pdptrs(struct kvm_vcpu *vcpu)
|
||||
(unsigned long *)&vcpu->arch.regs_dirty))
|
||||
return;
|
||||
|
||||
if (is_paging(vcpu) && is_pae(vcpu) && !is_long_mode(vcpu)) {
|
||||
if (is_pae_paging(vcpu)) {
|
||||
vmcs_write64(GUEST_PDPTR0, mmu->pdptrs[0]);
|
||||
vmcs_write64(GUEST_PDPTR1, mmu->pdptrs[1]);
|
||||
vmcs_write64(GUEST_PDPTR2, mmu->pdptrs[2]);
|
||||
@@ -4480,7 +4480,7 @@ static void ept_save_pdptrs(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct kvm_mmu *mmu = vcpu->arch.walk_mmu;
|
||||
|
||||
if (is_paging(vcpu) && is_pae(vcpu) && !is_long_mode(vcpu)) {
|
||||
if (is_pae_paging(vcpu)) {
|
||||
mmu->pdptrs[0] = vmcs_read64(GUEST_PDPTR0);
|
||||
mmu->pdptrs[1] = vmcs_read64(GUEST_PDPTR1);
|
||||
mmu->pdptrs[2] = vmcs_read64(GUEST_PDPTR2);
|
||||
@@ -10906,8 +10906,7 @@ static int nested_vmx_load_cr3(struct kvm_vcpu *vcpu, unsigned long cr3, bool ne
|
||||
* If PAE paging and EPT are both on, CR3 is not used by the CPU and
|
||||
* must not be dereferenced.
|
||||
*/
|
||||
if (!is_long_mode(vcpu) && is_pae(vcpu) && is_paging(vcpu) &&
|
||||
!nested_ept) {
|
||||
if (is_pae_paging(vcpu) && !nested_ept) {
|
||||
if (!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3)) {
|
||||
*entry_failure_code = ENTRY_FAIL_PDPTE;
|
||||
return 1;
|
||||
|
||||
@@ -620,7 +620,7 @@ bool pdptrs_changed(struct kvm_vcpu *vcpu)
|
||||
gfn_t gfn;
|
||||
int r;
|
||||
|
||||
if (is_long_mode(vcpu) || !is_pae(vcpu))
|
||||
if (!is_pae_paging(vcpu))
|
||||
return false;
|
||||
|
||||
if (!test_bit(VCPU_EXREG_PDPTR,
|
||||
@@ -849,8 +849,8 @@ int kvm_set_cr3(struct kvm_vcpu *vcpu, unsigned long cr3)
|
||||
if (is_long_mode(vcpu) &&
|
||||
(cr3 & rsvd_bits(cpuid_maxphyaddr(vcpu), 63)))
|
||||
return 1;
|
||||
else if (is_pae(vcpu) && is_paging(vcpu) &&
|
||||
!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
|
||||
else if (is_pae_paging(vcpu) &&
|
||||
!load_pdptrs(vcpu, vcpu->arch.walk_mmu, cr3))
|
||||
return 1;
|
||||
|
||||
vcpu->arch.cr3 = cr3;
|
||||
@@ -7787,7 +7787,7 @@ int kvm_arch_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
||||
kvm_update_cpuid(vcpu);
|
||||
|
||||
idx = srcu_read_lock(&vcpu->kvm->srcu);
|
||||
if (!is_long_mode(vcpu) && is_pae(vcpu)) {
|
||||
if (is_pae_paging(vcpu)) {
|
||||
load_pdptrs(vcpu, vcpu->arch.walk_mmu, kvm_read_cr3(vcpu));
|
||||
mmu_reset_needed = 1;
|
||||
}
|
||||
|
||||
@@ -94,6 +94,11 @@ static inline int is_paging(struct kvm_vcpu *vcpu)
|
||||
return likely(kvm_read_cr0_bits(vcpu, X86_CR0_PG));
|
||||
}
|
||||
|
||||
static inline bool is_pae_paging(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return !is_long_mode(vcpu) && is_pae(vcpu) && is_paging(vcpu);
|
||||
}
|
||||
|
||||
static inline u32 bit(int bitno)
|
||||
{
|
||||
return 1 << (bitno & 31);
|
||||
|
||||
@@ -3314,7 +3314,12 @@ static bool bfq_bfqq_may_idle(struct bfq_queue *bfqq)
|
||||
* whether bfqq is being weight-raised, because
|
||||
* bfq_symmetric_scenario() does not take into account also
|
||||
* weight-raised queues (see comments on
|
||||
* bfq_weights_tree_add()).
|
||||
* bfq_weights_tree_add()). In particular, if bfqq is being
|
||||
* weight-raised, it is important to idle only if there are
|
||||
* other, non-weight-raised queues that may steal throughput
|
||||
* to bfqq. Actually, we should be even more precise, and
|
||||
* differentiate between interactive weight raising and
|
||||
* soft real-time weight raising.
|
||||
*
|
||||
* As a side note, it is worth considering that the above
|
||||
* device-idling countermeasures may however fail in the
|
||||
@@ -3326,7 +3331,8 @@ static bool bfq_bfqq_may_idle(struct bfq_queue *bfqq)
|
||||
* to let requests be served in the desired order until all
|
||||
* the requests already queued in the device have been served.
|
||||
*/
|
||||
asymmetric_scenario = bfqq->wr_coeff > 1 ||
|
||||
asymmetric_scenario = (bfqq->wr_coeff > 1 &&
|
||||
bfqd->wr_busy_queues < bfqd->busy_queues) ||
|
||||
!bfq_symmetric_scenario(bfqd);
|
||||
|
||||
/*
|
||||
|
||||
@@ -261,15 +261,6 @@ static int pkcs1pad_encrypt(struct akcipher_request *req)
|
||||
pkcs1pad_sg_set_buf(req_ctx->in_sg, req_ctx->in_buf,
|
||||
ctx->key_size - 1 - req->src_len, req->src);
|
||||
|
||||
req_ctx->out_buf = kmalloc(ctx->key_size, GFP_KERNEL);
|
||||
if (!req_ctx->out_buf) {
|
||||
kfree(req_ctx->in_buf);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
pkcs1pad_sg_set_buf(req_ctx->out_sg, req_ctx->out_buf,
|
||||
ctx->key_size, NULL);
|
||||
|
||||
akcipher_request_set_tfm(&req_ctx->child_req, ctx->child);
|
||||
akcipher_request_set_callback(&req_ctx->child_req, req->base.flags,
|
||||
pkcs1pad_encrypt_sign_complete_cb, req);
|
||||
|
||||
@@ -98,6 +98,9 @@ struct lpss_private_data {
|
||||
u32 prv_reg_ctx[LPSS_PRV_REG_COUNT];
|
||||
};
|
||||
|
||||
/* Devices which need to be in D3 before lpss_iosf_enter_d3_state() proceeds */
|
||||
static u32 pmc_atom_d3_mask = 0xfe000ffe;
|
||||
|
||||
/* LPSS run time quirks */
|
||||
static unsigned int lpss_quirks;
|
||||
|
||||
@@ -174,6 +177,21 @@ static void byt_pwm_setup(struct lpss_private_data *pdata)
|
||||
|
||||
static void byt_i2c_setup(struct lpss_private_data *pdata)
|
||||
{
|
||||
const char *uid_str = acpi_device_uid(pdata->adev);
|
||||
acpi_handle handle = pdata->adev->handle;
|
||||
unsigned long long shared_host = 0;
|
||||
acpi_status status;
|
||||
long uid = 0;
|
||||
|
||||
/* Expected to always be true, but better safe then sorry */
|
||||
if (uid_str)
|
||||
uid = simple_strtol(uid_str, NULL, 10);
|
||||
|
||||
/* Detect I2C bus shared with PUNIT and ignore its d3 status */
|
||||
status = acpi_evaluate_integer(handle, "_SEM", NULL, &shared_host);
|
||||
if (ACPI_SUCCESS(status) && shared_host && uid)
|
||||
pmc_atom_d3_mask &= ~(BIT_LPSS2_F1_I2C1 << (uid - 1));
|
||||
|
||||
lpss_deassert_reset(pdata);
|
||||
|
||||
if (readl(pdata->mmio_base + pdata->dev_desc->prv_offset))
|
||||
@@ -789,7 +807,7 @@ static void lpss_iosf_enter_d3_state(void)
|
||||
* Here we read the values related to LPSS power island, i.e. LPSS
|
||||
* devices, excluding both LPSS DMA controllers, along with SCC domain.
|
||||
*/
|
||||
u32 func_dis, d3_sts_0, pmc_status, pmc_mask = 0xfe000ffe;
|
||||
u32 func_dis, d3_sts_0, pmc_status;
|
||||
int ret;
|
||||
|
||||
ret = pmc_atom_read(PMC_FUNC_DIS, &func_dis);
|
||||
@@ -807,7 +825,7 @@ static void lpss_iosf_enter_d3_state(void)
|
||||
* Shutdown both LPSS DMA controllers if and only if all other devices
|
||||
* are already in D3hot.
|
||||
*/
|
||||
pmc_status = (~(d3_sts_0 | func_dis)) & pmc_mask;
|
||||
pmc_status = (~(d3_sts_0 | func_dis)) & pmc_atom_d3_mask;
|
||||
if (pmc_status)
|
||||
goto exit;
|
||||
|
||||
|
||||
@@ -454,8 +454,9 @@ static void negotiate_os_control(struct acpi_pci_root *root, int *no_aspm)
|
||||
decode_osc_support(root, "OS supports", support);
|
||||
status = acpi_pci_osc_support(root, support);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
dev_info(&device->dev, "_OSC failed (%s); disabling ASPM\n",
|
||||
acpi_format_exception(status));
|
||||
dev_info(&device->dev, "_OSC failed (%s)%s\n",
|
||||
acpi_format_exception(status),
|
||||
pcie_aspm_support_enabled() ? "; disabling ASPM" : "");
|
||||
*no_aspm = 1;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -461,9 +461,9 @@ int component_bind_all(struct device *master_dev, void *data)
|
||||
}
|
||||
|
||||
if (ret != 0) {
|
||||
for (; i--; )
|
||||
if (!master->match->compare[i].duplicate) {
|
||||
c = master->match->compare[i].component;
|
||||
for (; i > 0; i--)
|
||||
if (!master->match->compare[i - 1].duplicate) {
|
||||
c = master->match->compare[i - 1].component;
|
||||
component_unbind(c, master, data);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -49,9 +49,14 @@ static struct opp_device *_find_opp_dev(const struct device *dev,
|
||||
static struct opp_table *_find_opp_table_unlocked(struct device *dev)
|
||||
{
|
||||
struct opp_table *opp_table;
|
||||
bool found;
|
||||
|
||||
list_for_each_entry(opp_table, &opp_tables, node) {
|
||||
if (_find_opp_dev(dev, opp_table)) {
|
||||
mutex_lock(&opp_table->lock);
|
||||
found = !!_find_opp_dev(dev, opp_table);
|
||||
mutex_unlock(&opp_table->lock);
|
||||
|
||||
if (found) {
|
||||
_get_opp_table_kref(opp_table);
|
||||
|
||||
return opp_table;
|
||||
@@ -711,6 +716,8 @@ struct opp_device *_add_opp_dev(const struct device *dev,
|
||||
|
||||
/* Initialize opp-dev */
|
||||
opp_dev->dev = dev;
|
||||
|
||||
mutex_lock(&opp_table->lock);
|
||||
list_add(&opp_dev->node, &opp_table->dev_list);
|
||||
|
||||
/* Create debugfs entries for the opp_table */
|
||||
@@ -718,6 +725,7 @@ struct opp_device *_add_opp_dev(const struct device *dev,
|
||||
if (ret)
|
||||
dev_err(dev, "%s: Failed to register opp debugfs (%d)\n",
|
||||
__func__, ret);
|
||||
mutex_unlock(&opp_table->lock);
|
||||
|
||||
return opp_dev;
|
||||
}
|
||||
@@ -736,6 +744,7 @@ static struct opp_table *_allocate_opp_table(struct device *dev)
|
||||
if (!opp_table)
|
||||
return NULL;
|
||||
|
||||
mutex_init(&opp_table->lock);
|
||||
INIT_LIST_HEAD(&opp_table->dev_list);
|
||||
|
||||
opp_dev = _add_opp_dev(dev, opp_table);
|
||||
@@ -757,7 +766,6 @@ static struct opp_table *_allocate_opp_table(struct device *dev)
|
||||
|
||||
BLOCKING_INIT_NOTIFIER_HEAD(&opp_table->head);
|
||||
INIT_LIST_HEAD(&opp_table->opp_list);
|
||||
mutex_init(&opp_table->lock);
|
||||
kref_init(&opp_table->kref);
|
||||
|
||||
/* Secure the device table modification */
|
||||
@@ -799,6 +807,10 @@ static void _opp_table_kref_release(struct kref *kref)
|
||||
if (!IS_ERR(opp_table->clk))
|
||||
clk_put(opp_table->clk);
|
||||
|
||||
/*
|
||||
* No need to take opp_table->lock here as we are guaranteed that no
|
||||
* references to the OPP table are taken at this point.
|
||||
*/
|
||||
opp_dev = list_first_entry(&opp_table->dev_list, struct opp_device,
|
||||
node);
|
||||
|
||||
@@ -1702,6 +1714,9 @@ void _dev_pm_opp_remove_table(struct opp_table *opp_table, struct device *dev,
|
||||
{
|
||||
struct dev_pm_opp *opp, *tmp;
|
||||
|
||||
/* Protect dev_list */
|
||||
mutex_lock(&opp_table->lock);
|
||||
|
||||
/* Find if opp_table manages a single device */
|
||||
if (list_is_singular(&opp_table->dev_list)) {
|
||||
/* Free static OPPs */
|
||||
@@ -1712,6 +1727,8 @@ void _dev_pm_opp_remove_table(struct opp_table *opp_table, struct device *dev,
|
||||
} else {
|
||||
_remove_opp_dev(_find_opp_dev(dev, opp_table), opp_table);
|
||||
}
|
||||
|
||||
mutex_unlock(&opp_table->lock);
|
||||
}
|
||||
|
||||
void _dev_pm_opp_find_and_remove_table(struct device *dev, bool remove_all)
|
||||
|
||||
@@ -222,8 +222,10 @@ int dev_pm_opp_get_sharing_cpus(struct device *cpu_dev, struct cpumask *cpumask)
|
||||
cpumask_clear(cpumask);
|
||||
|
||||
if (opp_table->shared_opp == OPP_TABLE_ACCESS_SHARED) {
|
||||
mutex_lock(&opp_table->lock);
|
||||
list_for_each_entry(opp_dev, &opp_table->dev_list, node)
|
||||
cpumask_set_cpu(opp_dev->dev->id, cpumask);
|
||||
mutex_unlock(&opp_table->lock);
|
||||
} else {
|
||||
cpumask_set_cpu(cpu_dev->id, cpumask);
|
||||
}
|
||||
|
||||
@@ -124,7 +124,7 @@ enum opp_table_access {
|
||||
* @dev_list: list of devices that share these OPPs
|
||||
* @opp_list: table of opps
|
||||
* @kref: for reference count of the table.
|
||||
* @lock: mutex protecting the opp_list.
|
||||
* @lock: mutex protecting the opp_list and dev_list.
|
||||
* @np: struct device_node pointer for opp's DT node.
|
||||
* @clock_latency_ns_max: Max clock latency in nanoseconds.
|
||||
* @shared_opp: OPP is shared between multiple devices.
|
||||
|
||||
@@ -360,6 +360,7 @@ void hci_uart_unregister_device(struct hci_uart *hu)
|
||||
{
|
||||
struct hci_dev *hdev = hu->hdev;
|
||||
|
||||
clear_bit(HCI_UART_PROTO_READY, &hu->flags);
|
||||
hci_unregister_dev(hdev);
|
||||
hci_free_dev(hdev);
|
||||
|
||||
|
||||
@@ -197,6 +197,10 @@ static void __init dmi_decode_ipmi(const struct dmi_header *dm)
|
||||
slave_addr = data[DMI_IPMI_SLAVEADDR];
|
||||
|
||||
memcpy(&base_addr, data + DMI_IPMI_ADDR, sizeof(unsigned long));
|
||||
if (!base_addr) {
|
||||
pr_err("Base address is zero, assuming no IPMI interface\n");
|
||||
return;
|
||||
}
|
||||
if (len >= DMI_IPMI_VER2_LENGTH) {
|
||||
if (type == IPMI_DMI_TYPE_SSIF) {
|
||||
offset = 0;
|
||||
|
||||
@@ -323,7 +323,7 @@ static void s5p_unset_indata(struct s5p_aes_dev *dev)
|
||||
}
|
||||
|
||||
static int s5p_make_sg_cpy(struct s5p_aes_dev *dev, struct scatterlist *src,
|
||||
struct scatterlist **dst)
|
||||
struct scatterlist **dst)
|
||||
{
|
||||
void *pages;
|
||||
int len;
|
||||
@@ -569,7 +569,7 @@ static int s5p_set_indata_start(struct s5p_aes_dev *dev,
|
||||
}
|
||||
|
||||
static int s5p_set_outdata_start(struct s5p_aes_dev *dev,
|
||||
struct ablkcipher_request *req)
|
||||
struct ablkcipher_request *req)
|
||||
{
|
||||
struct scatterlist *sg;
|
||||
int err;
|
||||
|
||||
@@ -143,7 +143,7 @@ config DMA_JZ4740
|
||||
|
||||
config DMA_JZ4780
|
||||
tristate "JZ4780 DMA support"
|
||||
depends on MACH_JZ4780 || COMPILE_TEST
|
||||
depends on MIPS || COMPILE_TEST
|
||||
select DMA_ENGINE
|
||||
select DMA_VIRTUAL_CHANNELS
|
||||
help
|
||||
|
||||
@@ -580,7 +580,7 @@ static enum dma_status jz4780_dma_tx_status(struct dma_chan *chan,
|
||||
to_jz4780_dma_desc(vdesc), 0);
|
||||
} else if (cookie == jzchan->desc->vdesc.tx.cookie) {
|
||||
txstate->residue = jz4780_dma_desc_residue(jzchan, jzchan->desc,
|
||||
(jzchan->curr_hwdesc + 1) % jzchan->desc->count);
|
||||
jzchan->curr_hwdesc + 1);
|
||||
} else
|
||||
txstate->residue = 0;
|
||||
|
||||
|
||||
@@ -2915,35 +2915,27 @@ static void sbridge_mce_output_error(struct mem_ctl_info *mci,
|
||||
* cccc = channel
|
||||
* If the mask doesn't match, report an error to the parsing logic
|
||||
*/
|
||||
if (! ((errcode & 0xef80) == 0x80)) {
|
||||
optype = "Can't parse: it is not a mem";
|
||||
} else {
|
||||
switch (optypenum) {
|
||||
case 0:
|
||||
optype = "generic undef request error";
|
||||
break;
|
||||
case 1:
|
||||
optype = "memory read error";
|
||||
break;
|
||||
case 2:
|
||||
optype = "memory write error";
|
||||
break;
|
||||
case 3:
|
||||
optype = "addr/cmd error";
|
||||
break;
|
||||
case 4:
|
||||
optype = "memory scrubbing error";
|
||||
break;
|
||||
default:
|
||||
optype = "reserved";
|
||||
break;
|
||||
}
|
||||
switch (optypenum) {
|
||||
case 0:
|
||||
optype = "generic undef request error";
|
||||
break;
|
||||
case 1:
|
||||
optype = "memory read error";
|
||||
break;
|
||||
case 2:
|
||||
optype = "memory write error";
|
||||
break;
|
||||
case 3:
|
||||
optype = "addr/cmd error";
|
||||
break;
|
||||
case 4:
|
||||
optype = "memory scrubbing error";
|
||||
break;
|
||||
default:
|
||||
optype = "reserved";
|
||||
break;
|
||||
}
|
||||
|
||||
/* Only decode errors with an valid address (ADDRV) */
|
||||
if (!GET_BITFIELD(m->status, 58, 58))
|
||||
return;
|
||||
|
||||
if (pvt->info.type == KNIGHTS_LANDING) {
|
||||
if (channel == 14) {
|
||||
edac_dbg(0, "%s%s err_code:%04x:%04x EDRAM bank %d\n",
|
||||
@@ -3049,17 +3041,11 @@ static int sbridge_mce_check_error(struct notifier_block *nb, unsigned long val,
|
||||
{
|
||||
struct mce *mce = (struct mce *)data;
|
||||
struct mem_ctl_info *mci;
|
||||
struct sbridge_pvt *pvt;
|
||||
char *type;
|
||||
|
||||
if (edac_get_report_status() == EDAC_REPORTING_DISABLED)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
mci = get_mci_for_node_id(mce->socketid, IMC0);
|
||||
if (!mci)
|
||||
return NOTIFY_DONE;
|
||||
pvt = mci->pvt_info;
|
||||
|
||||
/*
|
||||
* Just let mcelog handle it if the error is
|
||||
* outside the memory controller. A memory error
|
||||
@@ -3069,6 +3055,22 @@ static int sbridge_mce_check_error(struct notifier_block *nb, unsigned long val,
|
||||
if ((mce->status & 0xefff) >> 7 != 1)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Check ADDRV bit in STATUS */
|
||||
if (!GET_BITFIELD(mce->status, 58, 58))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Check MISCV bit in STATUS */
|
||||
if (!GET_BITFIELD(mce->status, 59, 59))
|
||||
return NOTIFY_DONE;
|
||||
|
||||
/* Check address type in MISC (physical address only) */
|
||||
if (GET_BITFIELD(mce->misc, 6, 8) != 2)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
mci = get_mci_for_node_id(mce->socketid, IMC0);
|
||||
if (!mci)
|
||||
return NOTIFY_DONE;
|
||||
|
||||
if (mce->mcgstatus & MCG_STATUS_MCIP)
|
||||
type = "Exception";
|
||||
else
|
||||
|
||||
@@ -155,7 +155,7 @@ static int cht_wc_extcon_get_charger(struct cht_wc_extcon_data *ext,
|
||||
dev_warn(ext->dev,
|
||||
"Unhandled charger type %d, defaulting to SDP\n",
|
||||
ret);
|
||||
/* Fall through, treat as SDP */
|
||||
return EXTCON_CHG_USB_SDP;
|
||||
case CHT_WC_USBSRC_TYPE_SDP:
|
||||
case CHT_WC_USBSRC_TYPE_FLOAT_DP_DN:
|
||||
case CHT_WC_USBSRC_TYPE_OTHER:
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/firmware.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <asm/set_memory.h>
|
||||
|
||||
MODULE_AUTHOR("Abhay Salunke <abhay_salunke@dell.com>");
|
||||
MODULE_DESCRIPTION("Driver for updating BIOS image on DELL systems");
|
||||
@@ -181,6 +182,11 @@ static int create_packet(void *data, size_t length)
|
||||
packet_data_temp_buf = NULL;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* set to uncachable or it may never get written back before reboot
|
||||
*/
|
||||
set_memory_uc((unsigned long)packet_data_temp_buf, 1 << ordernum);
|
||||
|
||||
spin_lock(&rbu_data.lock);
|
||||
|
||||
newpacket->data = packet_data_temp_buf;
|
||||
@@ -349,6 +355,8 @@ static void packet_empty_list(void)
|
||||
* to make sure there are no stale RBU packets left in memory
|
||||
*/
|
||||
memset(newpacket->data, 0, rbu_data.packetsize);
|
||||
set_memory_wb((unsigned long)newpacket->data,
|
||||
1 << newpacket->ordernum);
|
||||
free_pages((unsigned long) newpacket->data,
|
||||
newpacket->ordernum);
|
||||
kfree(newpacket);
|
||||
|
||||
@@ -148,6 +148,17 @@ static void hv_init_clockevent_device(struct clock_event_device *dev, int cpu)
|
||||
int hv_synic_alloc(void)
|
||||
{
|
||||
int cpu;
|
||||
struct hv_per_cpu_context *hv_cpu;
|
||||
|
||||
/*
|
||||
* First, zero all per-cpu memory areas so hv_synic_free() can
|
||||
* detect what memory has been allocated and cleanup properly
|
||||
* after any failures.
|
||||
*/
|
||||
for_each_present_cpu(cpu) {
|
||||
hv_cpu = per_cpu_ptr(hv_context.cpu_context, cpu);
|
||||
memset(hv_cpu, 0, sizeof(*hv_cpu));
|
||||
}
|
||||
|
||||
hv_context.hv_numa_map = kzalloc(sizeof(struct cpumask) * nr_node_ids,
|
||||
GFP_ATOMIC);
|
||||
@@ -157,10 +168,8 @@ int hv_synic_alloc(void)
|
||||
}
|
||||
|
||||
for_each_present_cpu(cpu) {
|
||||
struct hv_per_cpu_context *hv_cpu
|
||||
= per_cpu_ptr(hv_context.cpu_context, cpu);
|
||||
hv_cpu = per_cpu_ptr(hv_context.cpu_context, cpu);
|
||||
|
||||
memset(hv_cpu, 0, sizeof(*hv_cpu));
|
||||
tasklet_init(&hv_cpu->msg_dpc,
|
||||
vmbus_on_msg_dpc, (unsigned long) hv_cpu);
|
||||
|
||||
|
||||
@@ -23,6 +23,7 @@
|
||||
#include <linux/mm.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/percpu-defs.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/workqueue.h>
|
||||
@@ -44,7 +45,7 @@ struct etm_event_data {
|
||||
struct work_struct work;
|
||||
cpumask_t mask;
|
||||
void *snk_config;
|
||||
struct list_head **path;
|
||||
struct list_head * __percpu *path;
|
||||
};
|
||||
|
||||
static DEFINE_PER_CPU(struct perf_output_handle, ctx_handle);
|
||||
@@ -72,6 +73,18 @@ static const struct attribute_group *etm_pmu_attr_groups[] = {
|
||||
NULL,
|
||||
};
|
||||
|
||||
static inline struct list_head **
|
||||
etm_event_cpu_path_ptr(struct etm_event_data *data, int cpu)
|
||||
{
|
||||
return per_cpu_ptr(data->path, cpu);
|
||||
}
|
||||
|
||||
static inline struct list_head *
|
||||
etm_event_cpu_path(struct etm_event_data *data, int cpu)
|
||||
{
|
||||
return *etm_event_cpu_path_ptr(data, cpu);
|
||||
}
|
||||
|
||||
static void etm_event_read(struct perf_event *event) {}
|
||||
|
||||
static int etm_addr_filters_alloc(struct perf_event *event)
|
||||
@@ -131,23 +144,26 @@ static void free_event_data(struct work_struct *work)
|
||||
*/
|
||||
if (event_data->snk_config) {
|
||||
cpu = cpumask_first(mask);
|
||||
sink = coresight_get_sink(event_data->path[cpu]);
|
||||
sink = coresight_get_sink(etm_event_cpu_path(event_data, cpu));
|
||||
if (sink_ops(sink)->free_buffer)
|
||||
sink_ops(sink)->free_buffer(event_data->snk_config);
|
||||
}
|
||||
|
||||
for_each_cpu(cpu, mask) {
|
||||
if (!(IS_ERR_OR_NULL(event_data->path[cpu])))
|
||||
coresight_release_path(event_data->path[cpu]);
|
||||
struct list_head **ppath;
|
||||
|
||||
ppath = etm_event_cpu_path_ptr(event_data, cpu);
|
||||
if (!(IS_ERR_OR_NULL(*ppath)))
|
||||
coresight_release_path(*ppath);
|
||||
*ppath = NULL;
|
||||
}
|
||||
|
||||
kfree(event_data->path);
|
||||
free_percpu(event_data->path);
|
||||
kfree(event_data);
|
||||
}
|
||||
|
||||
static void *alloc_event_data(int cpu)
|
||||
{
|
||||
int size;
|
||||
cpumask_t *mask;
|
||||
struct etm_event_data *event_data;
|
||||
|
||||
@@ -158,7 +174,6 @@ static void *alloc_event_data(int cpu)
|
||||
|
||||
/* Make sure nothing disappears under us */
|
||||
get_online_cpus();
|
||||
size = num_online_cpus();
|
||||
|
||||
mask = &event_data->mask;
|
||||
if (cpu != -1)
|
||||
@@ -175,8 +190,8 @@ static void *alloc_event_data(int cpu)
|
||||
* unused memory when dealing with single CPU trace scenarios is small
|
||||
* compared to the cost of searching through an optimized array.
|
||||
*/
|
||||
event_data->path = kcalloc(size,
|
||||
sizeof(struct list_head *), GFP_KERNEL);
|
||||
event_data->path = alloc_percpu(struct list_head *);
|
||||
|
||||
if (!event_data->path) {
|
||||
kfree(event_data);
|
||||
return NULL;
|
||||
@@ -224,6 +239,7 @@ static void *etm_setup_aux(int event_cpu, void **pages,
|
||||
|
||||
/* Setup the path for each CPU in a trace session */
|
||||
for_each_cpu(cpu, mask) {
|
||||
struct list_head *path;
|
||||
struct coresight_device *csdev;
|
||||
|
||||
csdev = per_cpu(csdev_src, cpu);
|
||||
@@ -235,9 +251,11 @@ static void *etm_setup_aux(int event_cpu, void **pages,
|
||||
* list of devices from source to sink that can be
|
||||
* referenced later when the path is actually needed.
|
||||
*/
|
||||
event_data->path[cpu] = coresight_build_path(csdev, sink);
|
||||
if (IS_ERR(event_data->path[cpu]))
|
||||
path = coresight_build_path(csdev, sink);
|
||||
if (IS_ERR(path))
|
||||
goto err;
|
||||
|
||||
*etm_event_cpu_path_ptr(event_data, cpu) = path;
|
||||
}
|
||||
|
||||
if (!sink_ops(sink)->alloc_buffer)
|
||||
@@ -266,6 +284,7 @@ static void etm_event_start(struct perf_event *event, int flags)
|
||||
struct etm_event_data *event_data;
|
||||
struct perf_output_handle *handle = this_cpu_ptr(&ctx_handle);
|
||||
struct coresight_device *sink, *csdev = per_cpu(csdev_src, cpu);
|
||||
struct list_head *path;
|
||||
|
||||
if (!csdev)
|
||||
goto fail;
|
||||
@@ -278,8 +297,9 @@ static void etm_event_start(struct perf_event *event, int flags)
|
||||
if (!event_data)
|
||||
goto fail;
|
||||
|
||||
path = etm_event_cpu_path(event_data, cpu);
|
||||
/* We need a sink, no need to continue without one */
|
||||
sink = coresight_get_sink(event_data->path[cpu]);
|
||||
sink = coresight_get_sink(path);
|
||||
if (WARN_ON_ONCE(!sink || !sink_ops(sink)->set_buffer))
|
||||
goto fail_end_stop;
|
||||
|
||||
@@ -289,7 +309,7 @@ static void etm_event_start(struct perf_event *event, int flags)
|
||||
goto fail_end_stop;
|
||||
|
||||
/* Nothing will happen without a path */
|
||||
if (coresight_enable_path(event_data->path[cpu], CS_MODE_PERF))
|
||||
if (coresight_enable_path(path, CS_MODE_PERF))
|
||||
goto fail_end_stop;
|
||||
|
||||
/* Tell the perf core the event is alive */
|
||||
@@ -297,11 +317,13 @@ static void etm_event_start(struct perf_event *event, int flags)
|
||||
|
||||
/* Finally enable the tracer */
|
||||
if (source_ops(csdev)->enable(csdev, event, CS_MODE_PERF))
|
||||
goto fail_end_stop;
|
||||
goto fail_disable_path;
|
||||
|
||||
out:
|
||||
return;
|
||||
|
||||
fail_disable_path:
|
||||
coresight_disable_path(path);
|
||||
fail_end_stop:
|
||||
perf_aux_output_flag(handle, PERF_AUX_FLAG_TRUNCATED);
|
||||
perf_aux_output_end(handle, 0);
|
||||
@@ -317,6 +339,7 @@ static void etm_event_stop(struct perf_event *event, int mode)
|
||||
struct coresight_device *sink, *csdev = per_cpu(csdev_src, cpu);
|
||||
struct perf_output_handle *handle = this_cpu_ptr(&ctx_handle);
|
||||
struct etm_event_data *event_data = perf_get_aux(handle);
|
||||
struct list_head *path;
|
||||
|
||||
if (event->hw.state == PERF_HES_STOPPED)
|
||||
return;
|
||||
@@ -324,7 +347,11 @@ static void etm_event_stop(struct perf_event *event, int mode)
|
||||
if (!csdev)
|
||||
return;
|
||||
|
||||
sink = coresight_get_sink(event_data->path[cpu]);
|
||||
path = etm_event_cpu_path(event_data, cpu);
|
||||
if (!path)
|
||||
return;
|
||||
|
||||
sink = coresight_get_sink(path);
|
||||
if (!sink)
|
||||
return;
|
||||
|
||||
@@ -355,7 +382,7 @@ static void etm_event_stop(struct perf_event *event, int mode)
|
||||
}
|
||||
|
||||
/* Disabling the path make its elements available to other sessions */
|
||||
coresight_disable_path(event_data->path[cpu]);
|
||||
coresight_disable_path(path);
|
||||
}
|
||||
|
||||
static int etm_event_add(struct perf_event *event, int mode)
|
||||
|
||||
@@ -35,6 +35,7 @@
|
||||
#include <linux/pm_runtime.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/local.h>
|
||||
#include <asm/virt.h>
|
||||
|
||||
#include "coresight-etm4x.h"
|
||||
#include "coresight-etm-perf.h"
|
||||
@@ -623,7 +624,7 @@ static void etm4_set_default_config(struct etmv4_config *config)
|
||||
config->vinst_ctrl |= BIT(0);
|
||||
}
|
||||
|
||||
static u64 etm4_get_access_type(struct etmv4_config *config)
|
||||
static u64 etm4_get_ns_access_type(struct etmv4_config *config)
|
||||
{
|
||||
u64 access_type = 0;
|
||||
|
||||
@@ -634,17 +635,26 @@ static u64 etm4_get_access_type(struct etmv4_config *config)
|
||||
* Bit[13] Exception level 1 - OS
|
||||
* Bit[14] Exception level 2 - Hypervisor
|
||||
* Bit[15] Never implemented
|
||||
*
|
||||
* Always stay away from hypervisor mode.
|
||||
*/
|
||||
access_type = ETM_EXLEVEL_NS_HYP;
|
||||
|
||||
if (config->mode & ETM_MODE_EXCL_KERN)
|
||||
access_type |= ETM_EXLEVEL_NS_OS;
|
||||
if (!is_kernel_in_hyp_mode()) {
|
||||
/* Stay away from hypervisor mode for non-VHE */
|
||||
access_type = ETM_EXLEVEL_NS_HYP;
|
||||
if (config->mode & ETM_MODE_EXCL_KERN)
|
||||
access_type |= ETM_EXLEVEL_NS_OS;
|
||||
} else if (config->mode & ETM_MODE_EXCL_KERN) {
|
||||
access_type = ETM_EXLEVEL_NS_HYP;
|
||||
}
|
||||
|
||||
if (config->mode & ETM_MODE_EXCL_USER)
|
||||
access_type |= ETM_EXLEVEL_NS_APP;
|
||||
|
||||
return access_type;
|
||||
}
|
||||
|
||||
static u64 etm4_get_access_type(struct etmv4_config *config)
|
||||
{
|
||||
u64 access_type = etm4_get_ns_access_type(config);
|
||||
|
||||
/*
|
||||
* EXLEVEL_S, bits[11:8], don't trace anything happening
|
||||
* in secure state.
|
||||
@@ -898,20 +908,10 @@ void etm4_config_trace_mode(struct etmv4_config *config)
|
||||
|
||||
addr_acc = config->addr_acc[ETM_DEFAULT_ADDR_COMP];
|
||||
/* clear default config */
|
||||
addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS);
|
||||
addr_acc &= ~(ETM_EXLEVEL_NS_APP | ETM_EXLEVEL_NS_OS |
|
||||
ETM_EXLEVEL_NS_HYP);
|
||||
|
||||
/*
|
||||
* EXLEVEL_NS, bits[15:12]
|
||||
* The Exception levels are:
|
||||
* Bit[12] Exception level 0 - Application
|
||||
* Bit[13] Exception level 1 - OS
|
||||
* Bit[14] Exception level 2 - Hypervisor
|
||||
* Bit[15] Never implemented
|
||||
*/
|
||||
if (mode & ETM_MODE_EXCL_KERN)
|
||||
addr_acc |= ETM_EXLEVEL_NS_OS;
|
||||
else
|
||||
addr_acc |= ETM_EXLEVEL_NS_APP;
|
||||
addr_acc |= etm4_get_ns_access_type(config);
|
||||
|
||||
config->addr_acc[ETM_DEFAULT_ADDR_COMP] = addr_acc;
|
||||
config->addr_acc[ETM_DEFAULT_ADDR_COMP + 1] = addr_acc;
|
||||
|
||||
@@ -442,10 +442,10 @@ static void tmc_update_etf_buffer(struct coresight_device *csdev,
|
||||
case TMC_MEM_INTF_WIDTH_32BITS:
|
||||
case TMC_MEM_INTF_WIDTH_64BITS:
|
||||
case TMC_MEM_INTF_WIDTH_128BITS:
|
||||
mask = GENMASK(31, 5);
|
||||
mask = GENMASK(31, 4);
|
||||
break;
|
||||
case TMC_MEM_INTF_WIDTH_256BITS:
|
||||
mask = GENMASK(31, 6);
|
||||
mask = GENMASK(31, 5);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -140,12 +140,14 @@ static int coresight_enable_sink(struct coresight_device *csdev, u32 mode)
|
||||
{
|
||||
int ret;
|
||||
|
||||
if (!csdev->enable) {
|
||||
if (sink_ops(csdev)->enable) {
|
||||
ret = sink_ops(csdev)->enable(csdev, mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
/*
|
||||
* We need to make sure the "new" session is compatible with the
|
||||
* existing "mode" of operation.
|
||||
*/
|
||||
if (sink_ops(csdev)->enable) {
|
||||
ret = sink_ops(csdev)->enable(csdev, mode);
|
||||
if (ret)
|
||||
return ret;
|
||||
csdev->enable = true;
|
||||
}
|
||||
|
||||
@@ -347,8 +349,14 @@ int coresight_enable_path(struct list_head *path, u32 mode)
|
||||
switch (type) {
|
||||
case CORESIGHT_DEV_TYPE_SINK:
|
||||
ret = coresight_enable_sink(csdev, mode);
|
||||
/*
|
||||
* Sink is the first component turned on. If we
|
||||
* failed to enable the sink, there are no components
|
||||
* that need disabling. Disabling the path here
|
||||
* would mean we could disrupt an existing session.
|
||||
*/
|
||||
if (ret)
|
||||
goto err;
|
||||
goto out;
|
||||
break;
|
||||
case CORESIGHT_DEV_TYPE_SOURCE:
|
||||
/* sources are enabled from either sysFS or Perf */
|
||||
|
||||
@@ -135,7 +135,8 @@ struct aspeed_i2c_bus {
|
||||
/* Synchronizes I/O mem access to base. */
|
||||
spinlock_t lock;
|
||||
struct completion cmd_complete;
|
||||
u32 (*get_clk_reg_val)(u32 divisor);
|
||||
u32 (*get_clk_reg_val)(struct device *dev,
|
||||
u32 divisor);
|
||||
unsigned long parent_clk_frequency;
|
||||
u32 bus_frequency;
|
||||
/* Transaction state. */
|
||||
@@ -679,16 +680,27 @@ static const struct i2c_algorithm aspeed_i2c_algo = {
|
||||
#endif /* CONFIG_I2C_SLAVE */
|
||||
};
|
||||
|
||||
static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor)
|
||||
static u32 aspeed_i2c_get_clk_reg_val(struct device *dev,
|
||||
u32 clk_high_low_mask,
|
||||
u32 divisor)
|
||||
{
|
||||
u32 base_clk, clk_high, clk_low, tmp;
|
||||
u32 base_clk_divisor, clk_high_low_max, clk_high, clk_low, tmp;
|
||||
|
||||
/*
|
||||
* SCL_high and SCL_low represent a value 1 greater than what is stored
|
||||
* since a zero divider is meaningless. Thus, the max value each can
|
||||
* store is every bit set + 1. Since SCL_high and SCL_low are added
|
||||
* together (see below), the max value of both is the max value of one
|
||||
* them times two.
|
||||
*/
|
||||
clk_high_low_max = (clk_high_low_mask + 1) * 2;
|
||||
|
||||
/*
|
||||
* The actual clock frequency of SCL is:
|
||||
* SCL_freq = APB_freq / (base_freq * (SCL_high + SCL_low))
|
||||
* = APB_freq / divisor
|
||||
* where base_freq is a programmable clock divider; its value is
|
||||
* base_freq = 1 << base_clk
|
||||
* base_freq = 1 << base_clk_divisor
|
||||
* SCL_high is the number of base_freq clock cycles that SCL stays high
|
||||
* and SCL_low is the number of base_freq clock cycles that SCL stays
|
||||
* low for a period of SCL.
|
||||
@@ -698,47 +710,59 @@ static u32 aspeed_i2c_get_clk_reg_val(u32 clk_high_low_max, u32 divisor)
|
||||
* SCL_low = clk_low + 1
|
||||
* Thus,
|
||||
* SCL_freq = APB_freq /
|
||||
* ((1 << base_clk) * (clk_high + 1 + clk_low + 1))
|
||||
* ((1 << base_clk_divisor) * (clk_high + 1 + clk_low + 1))
|
||||
* The documentation recommends clk_high >= clk_high_max / 2 and
|
||||
* clk_low >= clk_low_max / 2 - 1 when possible; this last constraint
|
||||
* gives us the following solution:
|
||||
*/
|
||||
base_clk = divisor > clk_high_low_max ?
|
||||
base_clk_divisor = divisor > clk_high_low_max ?
|
||||
ilog2((divisor - 1) / clk_high_low_max) + 1 : 0;
|
||||
tmp = (divisor + (1 << base_clk) - 1) >> base_clk;
|
||||
clk_low = tmp / 2;
|
||||
clk_high = tmp - clk_low;
|
||||
|
||||
if (clk_high)
|
||||
clk_high--;
|
||||
if (base_clk_divisor > ASPEED_I2CD_TIME_BASE_DIVISOR_MASK) {
|
||||
base_clk_divisor = ASPEED_I2CD_TIME_BASE_DIVISOR_MASK;
|
||||
clk_low = clk_high_low_mask;
|
||||
clk_high = clk_high_low_mask;
|
||||
dev_err(dev,
|
||||
"clamping clock divider: divider requested, %u, is greater than largest possible divider, %u.\n",
|
||||
divisor, (1 << base_clk_divisor) * clk_high_low_max);
|
||||
} else {
|
||||
tmp = (divisor + (1 << base_clk_divisor) - 1)
|
||||
>> base_clk_divisor;
|
||||
clk_low = tmp / 2;
|
||||
clk_high = tmp - clk_low;
|
||||
|
||||
if (clk_low)
|
||||
clk_low--;
|
||||
if (clk_high)
|
||||
clk_high--;
|
||||
|
||||
if (clk_low)
|
||||
clk_low--;
|
||||
}
|
||||
|
||||
|
||||
return ((clk_high << ASPEED_I2CD_TIME_SCL_HIGH_SHIFT)
|
||||
& ASPEED_I2CD_TIME_SCL_HIGH_MASK)
|
||||
| ((clk_low << ASPEED_I2CD_TIME_SCL_LOW_SHIFT)
|
||||
& ASPEED_I2CD_TIME_SCL_LOW_MASK)
|
||||
| (base_clk & ASPEED_I2CD_TIME_BASE_DIVISOR_MASK);
|
||||
| (base_clk_divisor
|
||||
& ASPEED_I2CD_TIME_BASE_DIVISOR_MASK);
|
||||
}
|
||||
|
||||
static u32 aspeed_i2c_24xx_get_clk_reg_val(u32 divisor)
|
||||
static u32 aspeed_i2c_24xx_get_clk_reg_val(struct device *dev, u32 divisor)
|
||||
{
|
||||
/*
|
||||
* clk_high and clk_low are each 3 bits wide, so each can hold a max
|
||||
* value of 8 giving a clk_high_low_max of 16.
|
||||
*/
|
||||
return aspeed_i2c_get_clk_reg_val(16, divisor);
|
||||
return aspeed_i2c_get_clk_reg_val(dev, GENMASK(2, 0), divisor);
|
||||
}
|
||||
|
||||
static u32 aspeed_i2c_25xx_get_clk_reg_val(u32 divisor)
|
||||
static u32 aspeed_i2c_25xx_get_clk_reg_val(struct device *dev, u32 divisor)
|
||||
{
|
||||
/*
|
||||
* clk_high and clk_low are each 4 bits wide, so each can hold a max
|
||||
* value of 16 giving a clk_high_low_max of 32.
|
||||
*/
|
||||
return aspeed_i2c_get_clk_reg_val(32, divisor);
|
||||
return aspeed_i2c_get_clk_reg_val(dev, GENMASK(3, 0), divisor);
|
||||
}
|
||||
|
||||
/* precondition: bus.lock has been acquired. */
|
||||
@@ -751,7 +775,7 @@ static int aspeed_i2c_init_clk(struct aspeed_i2c_bus *bus)
|
||||
clk_reg_val &= (ASPEED_I2CD_TIME_TBUF_MASK |
|
||||
ASPEED_I2CD_TIME_THDSTA_MASK |
|
||||
ASPEED_I2CD_TIME_TACST_MASK);
|
||||
clk_reg_val |= bus->get_clk_reg_val(divisor);
|
||||
clk_reg_val |= bus->get_clk_reg_val(bus->dev, divisor);
|
||||
writel(clk_reg_val, bus->base + ASPEED_I2C_AC_TIMING_REG1);
|
||||
writel(ASPEED_NO_TIMEOUT_CTRL, bus->base + ASPEED_I2C_AC_TIMING_REG2);
|
||||
|
||||
@@ -859,7 +883,8 @@ static int aspeed_i2c_probe_bus(struct platform_device *pdev)
|
||||
if (!match)
|
||||
bus->get_clk_reg_val = aspeed_i2c_24xx_get_clk_reg_val;
|
||||
else
|
||||
bus->get_clk_reg_val = (u32 (*)(u32))match->data;
|
||||
bus->get_clk_reg_val = (u32 (*)(struct device *, u32))
|
||||
match->data;
|
||||
|
||||
/* Initialize the I2C adapter */
|
||||
spin_lock_init(&bus->lock);
|
||||
|
||||
@@ -43,6 +43,7 @@ struct i2c_acpi_lookup {
|
||||
int index;
|
||||
u32 speed;
|
||||
u32 min_speed;
|
||||
u32 force_speed;
|
||||
};
|
||||
|
||||
static int i2c_acpi_fill_info(struct acpi_resource *ares, void *data)
|
||||
@@ -240,6 +241,19 @@ i2c_acpi_match_device(const struct acpi_device_id *matches,
|
||||
return acpi_match_device(matches, &client->dev);
|
||||
}
|
||||
|
||||
static const struct acpi_device_id i2c_acpi_force_400khz_device_ids[] = {
|
||||
/*
|
||||
* These Silead touchscreen controllers only work at 400KHz, for
|
||||
* some reason they do not work at 100KHz. On some devices the ACPI
|
||||
* tables list another device at their bus as only being capable
|
||||
* of 100KHz, testing has shown that these other devices work fine
|
||||
* at 400KHz (as can be expected of any recent i2c hw) so we force
|
||||
* the speed of the bus to 400 KHz if a Silead device is present.
|
||||
*/
|
||||
{ "MSSL1680", 0 },
|
||||
{}
|
||||
};
|
||||
|
||||
static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
|
||||
void *data, void **return_value)
|
||||
{
|
||||
@@ -258,6 +272,9 @@ static acpi_status i2c_acpi_lookup_speed(acpi_handle handle, u32 level,
|
||||
if (lookup->speed <= lookup->min_speed)
|
||||
lookup->min_speed = lookup->speed;
|
||||
|
||||
if (acpi_match_device_ids(adev, i2c_acpi_force_400khz_device_ids) == 0)
|
||||
lookup->force_speed = 400000;
|
||||
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
@@ -295,7 +312,16 @@ u32 i2c_acpi_find_bus_speed(struct device *dev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
return lookup.min_speed != UINT_MAX ? lookup.min_speed : 0;
|
||||
if (lookup.force_speed) {
|
||||
if (lookup.force_speed != lookup.min_speed)
|
||||
dev_warn(dev, FW_BUG "DSDT uses known not-working I2C bus speed %d, forcing it to %d\n",
|
||||
lookup.min_speed, lookup.force_speed);
|
||||
return lookup.force_speed;
|
||||
} else if (lookup.min_speed != UINT_MAX) {
|
||||
return lookup.min_speed;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(i2c_acpi_find_bus_speed);
|
||||
|
||||
|
||||
@@ -289,7 +289,7 @@ static int max9611_read_csa_voltage(struct max9611_dev *max9611,
|
||||
return ret;
|
||||
|
||||
if (*adc_raw > 0) {
|
||||
*csa_gain = gain_selectors[i];
|
||||
*csa_gain = (enum max9611_csa_gain)gain_selectors[i];
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -94,17 +94,22 @@ static int mcp4922_write_raw(struct iio_dev *indio_dev,
|
||||
long mask)
|
||||
{
|
||||
struct mcp4922_state *state = iio_priv(indio_dev);
|
||||
int ret;
|
||||
|
||||
if (val2 != 0)
|
||||
return -EINVAL;
|
||||
|
||||
switch (mask) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
if (val > GENMASK(chan->scan_type.realbits-1, 0))
|
||||
if (val < 0 || val > GENMASK(chan->scan_type.realbits - 1, 0))
|
||||
return -EINVAL;
|
||||
val <<= chan->scan_type.shift;
|
||||
state->value[chan->channel] = val;
|
||||
return mcp4922_spi_write(state, chan->channel, val);
|
||||
|
||||
ret = mcp4922_spi_write(state, chan->channel, val);
|
||||
if (!ret)
|
||||
state->value[chan->channel] = val;
|
||||
return ret;
|
||||
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -599,8 +599,8 @@ void ib_unregister_device(struct ib_device *device)
|
||||
}
|
||||
up_read(&lists_rwsem);
|
||||
|
||||
ib_device_unregister_rdmacg(device);
|
||||
ib_device_unregister_sysfs(device);
|
||||
ib_device_unregister_rdmacg(device);
|
||||
|
||||
mutex_unlock(&device_mutex);
|
||||
|
||||
|
||||
@@ -217,30 +217,30 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
/* Validate parameters */
|
||||
qpn = get_spl_qp_index(qp_type);
|
||||
if (qpn == -1) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: invalid QP Type %d\n",
|
||||
qp_type);
|
||||
dev_dbg_ratelimited(&device->dev, "%s: invalid QP Type %d\n",
|
||||
__func__, qp_type);
|
||||
goto error1;
|
||||
}
|
||||
|
||||
if (rmpp_version && rmpp_version != IB_MGMT_RMPP_VERSION) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: invalid RMPP Version %u\n",
|
||||
rmpp_version);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: invalid RMPP Version %u\n",
|
||||
__func__, rmpp_version);
|
||||
goto error1;
|
||||
}
|
||||
|
||||
/* Validate MAD registration request if supplied */
|
||||
if (mad_reg_req) {
|
||||
if (mad_reg_req->mgmt_class_version >= MAX_MGMT_VERSION) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: invalid Class Version %u\n",
|
||||
mad_reg_req->mgmt_class_version);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: invalid Class Version %u\n",
|
||||
__func__,
|
||||
mad_reg_req->mgmt_class_version);
|
||||
goto error1;
|
||||
}
|
||||
if (!recv_handler) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: no recv_handler\n");
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: no recv_handler\n", __func__);
|
||||
goto error1;
|
||||
}
|
||||
if (mad_reg_req->mgmt_class >= MAX_MGMT_CLASS) {
|
||||
@@ -250,9 +250,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
*/
|
||||
if (mad_reg_req->mgmt_class !=
|
||||
IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: Invalid Mgmt Class 0x%x\n",
|
||||
mad_reg_req->mgmt_class);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: Invalid Mgmt Class 0x%x\n",
|
||||
__func__, mad_reg_req->mgmt_class);
|
||||
goto error1;
|
||||
}
|
||||
} else if (mad_reg_req->mgmt_class == 0) {
|
||||
@@ -260,8 +260,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
* Class 0 is reserved in IBA and is used for
|
||||
* aliasing of IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE
|
||||
*/
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: Invalid Mgmt Class 0\n");
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: Invalid Mgmt Class 0\n",
|
||||
__func__);
|
||||
goto error1;
|
||||
} else if (is_vendor_class(mad_reg_req->mgmt_class)) {
|
||||
/*
|
||||
@@ -269,18 +270,19 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
* ensure supplied OUI is not zero
|
||||
*/
|
||||
if (!is_vendor_oui(mad_reg_req->oui)) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: No OUI specified for class 0x%x\n",
|
||||
mad_reg_req->mgmt_class);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: No OUI specified for class 0x%x\n",
|
||||
__func__,
|
||||
mad_reg_req->mgmt_class);
|
||||
goto error1;
|
||||
}
|
||||
}
|
||||
/* Make sure class supplied is consistent with RMPP */
|
||||
if (!ib_is_mad_class_rmpp(mad_reg_req->mgmt_class)) {
|
||||
if (rmpp_version) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: RMPP version for non-RMPP class 0x%x\n",
|
||||
mad_reg_req->mgmt_class);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: RMPP version for non-RMPP class 0x%x\n",
|
||||
__func__, mad_reg_req->mgmt_class);
|
||||
goto error1;
|
||||
}
|
||||
}
|
||||
@@ -291,9 +293,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
IB_MGMT_CLASS_SUBN_LID_ROUTED) &&
|
||||
(mad_reg_req->mgmt_class !=
|
||||
IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: Invalid SM QP type: class 0x%x\n",
|
||||
mad_reg_req->mgmt_class);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: Invalid SM QP type: class 0x%x\n",
|
||||
__func__, mad_reg_req->mgmt_class);
|
||||
goto error1;
|
||||
}
|
||||
} else {
|
||||
@@ -301,9 +303,9 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
IB_MGMT_CLASS_SUBN_LID_ROUTED) ||
|
||||
(mad_reg_req->mgmt_class ==
|
||||
IB_MGMT_CLASS_SUBN_DIRECTED_ROUTE)) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: Invalid GS QP type: class 0x%x\n",
|
||||
mad_reg_req->mgmt_class);
|
||||
dev_dbg_ratelimited(&device->dev,
|
||||
"%s: Invalid GS QP type: class 0x%x\n",
|
||||
__func__, mad_reg_req->mgmt_class);
|
||||
goto error1;
|
||||
}
|
||||
}
|
||||
@@ -318,18 +320,18 @@ struct ib_mad_agent *ib_register_mad_agent(struct ib_device *device,
|
||||
/* Validate device and port */
|
||||
port_priv = ib_get_mad_port(device, port_num);
|
||||
if (!port_priv) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: Invalid port %d\n",
|
||||
port_num);
|
||||
dev_dbg_ratelimited(&device->dev, "%s: Invalid port %d\n",
|
||||
__func__, port_num);
|
||||
ret = ERR_PTR(-ENODEV);
|
||||
goto error1;
|
||||
}
|
||||
|
||||
/* Verify the QP requested is supported. For example, Ethernet devices
|
||||
* will not have QP0 */
|
||||
/* Verify the QP requested is supported. For example, Ethernet devices
|
||||
* will not have QP0.
|
||||
*/
|
||||
if (!port_priv->qp_info[qpn].qp) {
|
||||
dev_notice(&device->dev,
|
||||
"ib_register_mad_agent: QP %d not supported\n", qpn);
|
||||
dev_dbg_ratelimited(&device->dev, "%s: QP %d not supported\n",
|
||||
__func__, qpn);
|
||||
ret = ERR_PTR(-EPROTONOSUPPORT);
|
||||
goto error1;
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user