mirror of
https://github.com/hardkernel/linux.git
synced 2026-03-25 20:10:23 +09:00
Merge 5.15.139 into android14-5.15-lts
Changes in 5.15.139
iov_iter, x86: Be consistent about the __user tag on copy_mc_to_user()
sched/uclamp: Ignore (util == 0) optimization in feec() when p_util_max = 0
sched: Fix stop_one_cpu_nowait() vs hotplug
vfs: fix readahead(2) on block devices
writeback, cgroup: switch inodes with dirty timestamps to release dying cgwbs
x86/srso: Fix SBPB enablement for (possible) future fixed HW
futex: Don't include process MM in futex key on no-MMU
x86: Share definition of __is_canonical_address()
x86/sev-es: Allow copy_from_kernel_nofault() in earlier boot
x86/boot: Fix incorrect startup_gdt_descr.size
pstore/platform: Add check for kstrdup
genirq/matrix: Exclude managed interrupts in irq_matrix_allocated()
i40e: fix potential memory leaks in i40e_remove()
selftests/bpf: Test tail call counting with bpf2bpf and data on stack
selftests/bpf: Correct map_fd to data_fd in tailcalls
udp: add missing WRITE_ONCE() around up->encap_rcv
tcp: call tcp_try_undo_recovery when an RTOd TFO SYNACK is ACKed
gve: Use size_add() in call to struct_size()
mlxsw: Use size_mul() in call to struct_size()
tipc: Use size_add() in calls to struct_size()
net: spider_net: Use size_add() in call to struct_size()
wifi: rtw88: debug: Fix the NULL vs IS_ERR() bug for debugfs_create_file()
wifi: mt76: mt7603: rework/fix rx pse hang check
mt76: dma: use kzalloc instead of devm_kzalloc for txwi
mt76: add support for overriding the device used for DMA mapping
mt76: pass original queue id from __mt76_tx_queue_skb to the driver
wifi: mt76: mt7603: improve stuck beacon handling
tcp_metrics: add missing barriers on delete
tcp_metrics: properly set tp->snd_ssthresh in tcp_init_metrics()
tcp_metrics: do not create an entry from tcp_init_metrics()
wifi: rtlwifi: fix EDCA limit set by BT coexistence
can: dev: can_restart(): don't crash kernel if carrier is OK
can: dev: can_restart(): fix race condition between controller restart and netif_carrier_on()
can: dev: can_put_echo_skb(): don't crash kernel if can_priv::echo_skb is accessed out of bounds
PM / devfreq: rockchip-dfi: Make pmu regmap mandatory
netfilter: nf_tables: Drop pointless memset when dumping rules
thermal: core: prevent potential string overflow
r8169: use tp_to_dev instead of open code
r8169: fix rare issue with broken rx after link-down on RTL8125
chtls: fix tp->rcv_tstamp initialization
tcp: fix cookie_init_timestamp() overflows
iwlwifi: pcie: adjust to Bz completion descriptor
wifi: iwlwifi: call napi_synchronize() before freeing rx/tx queues
wifi: iwlwifi: pcie: synchronize IRQs before NAPI
wifi: iwlwifi: empty overflow queue during flush
ACPI: sysfs: Fix create_pnp_modalias() and create_of_modalias()
ipv6: avoid atomic fragment on GSO packets
net: add DEV_STATS_READ() helper
ipvlan: properly track tx_errors
regmap: debugfs: Fix a erroneous check after snprintf()
spi: tegra: Fix missing IRQ check in tegra_slink_probe()
clk: qcom: clk-rcg2: Fix clock rate overflow for high parent frequencies
clk: qcom: mmcc-msm8998: Don't check halt bit on some branch clks
clk: qcom: mmcc-msm8998: Fix the SMMU GDSC
clk: qcom: gcc-sm8150: Fix gcc_sdcc2_apps_clk_src
clk: imx: Select MXC_CLK for CLK_IMX8QXP
clk: imx: imx8mq: correct error handling path
clk: imx: imx8qxp: Fix elcdif_pll clock
clk: renesas: rzg2l: Simplify multiplication/shift logic
clk: renesas: rzg2l: Use FIELD_GET() for PLL register fields
clk: renesas: rzg2l: Fix computation formula
spi: nxp-fspi: use the correct ioremap function
clk: keystone: pll: fix a couple NULL vs IS_ERR() checks
clk: ti: Add ti_dt_clk_name() helper to use clock-output-names
clk: ti: Update pll and clockdomain clocks to use ti_dt_clk_name()
clk: ti: Update component clocks to use ti_dt_clk_name()
clk: ti: change ti_clk_register[_omap_hw]() API
clk: ti: fix double free in of_ti_divider_clk_setup()
clk: npcm7xx: Fix incorrect kfree
clk: mediatek: clk-mt6765: Add check for mtk_alloc_clk_data
clk: mediatek: clk-mt6779: Add check for mtk_alloc_clk_data
clk: mediatek: clk-mt6797: Add check for mtk_alloc_clk_data
clk: mediatek: clk-mt7629-eth: Add check for mtk_alloc_clk_data
clk: mediatek: clk-mt7629: Add check for mtk_alloc_clk_data
clk: mediatek: clk-mt2701: Add check for mtk_alloc_clk_data
clk: qcom: config IPQ_APSS_6018 should depend on QCOM_SMEM
platform/x86: wmi: Fix probe failure when failing to register WMI devices
platform/x86: wmi: remove unnecessary initializations
platform/x86: wmi: Fix opening of char device
hwmon: (axi-fan-control) Fix possible NULL pointer dereference
hwmon: (coretemp) Fix potentially truncated sysfs attribute name
drm/rockchip: vop: Fix reset of state in duplicate state crtc funcs
drm/rockchip: vop: Fix call to crtc reset helper
drm/radeon: possible buffer overflow
drm/mipi-dsi: Create devm device registration
drm/mipi-dsi: Create devm device attachment
drm/bridge: lt8912b: Switch to devm MIPI-DSI helpers
drm/bridge: lt8912b: Register and attach our DSI device at probe
drm/bridge: lt8912b: Add hot plug detection
drm/bridge: lt8912b: Fix bridge_detach
drm/bridge: lt8912b: Fix crash on bridge detach
drm/bridge: lt8912b: Manually disable HPD only if it was enabled
drm/bridge: lt8912b: Add missing drm_bridge_attach call
drm/bridge: tc358768: Fix use of uninitialized variable
drm/bridge: tc358768: Disable non-continuous clock mode
drm/bridge: tc358768: Fix bit updates
drm/amdkfd: fix some race conditions in vram buffer alloc/free of svm code
drm/mediatek: Fix iommu fault by swapping FBs after updating plane state
drm/mediatek: Fix iommu fault during crtc enabling
drm/rockchip: cdn-dp: Fix some error handling paths in cdn_dp_probe()
drm/bridge: lt9611uxc: Switch to devm MIPI-DSI helpers
drm/bridge: lt9611uxc: Register and attach our DSI device at probe
drm/bridge: lt9611uxc: fix the race in the error path
arm64/arm: xen: enlighten: Fix KPTI checks
drm/rockchip: Fix type promotion bug in rockchip_gem_iommu_map()
xen-pciback: Consider INTx disabled when MSI/MSI-X is enabled
drm/msm/dsi: use msm_gem_kernel_put to free TX buffer
drm: mediatek: mtk_dsi: Fix NO_EOT_PACKET settings/handling
perf: hisi: Fix use-after-free when register pmu fails
ARM: dts: renesas: blanche: Fix typo in GP_11_2 pin name
arm64: dts: qcom: msm8916: Fix iommu local address range
arm64: dts: qcom: msm8992-libra: drop duplicated reserved memory
arm64: dts: qcom: sc7280: Add missing LMH interrupts
arm64: dts: qcom: sdm845-mtp: fix WiFi configuration
ARM64: dts: marvell: cn9310: Use appropriate label for spi1 pins
arm64: dts: qcom: apq8016-sbc: Add missing ADV7533 regulators
ARM: dts: qcom: mdm9615: populate vsdcc fixed regulator
soc: qcom: llcc: Handle a second device without data corruption
firmware: ti_sci: Mark driver as non removable
firmware: arm_ffa: Assign the missing IDR allocation ID to the FFA device
clk: scmi: Free scmi_clk allocated when the clocks with invalid info are skipped
arm64: dts: imx8qm-ss-img: Fix jpegenc compatible entry
arm64: dts: imx8mm: Add sound-dai-cells to micfil node
arm64: dts: imx8mn: Add sound-dai-cells to micfil node
selftests/pidfd: Fix ksft print formats
selftests/resctrl: Ensure the benchmark commands fits to its array
crypto: hisilicon/hpre - Fix a erroneous check after snprintf()
hwrng: geode - fix accessing registers
RDMA/core: Use size_{add,sub,mul}() in calls to struct_size()
scsi: ibmvfc: Fix erroneous use of rtas_busy_delay with hcall return code
libnvdimm/of_pmem: Use devm_kstrdup instead of kstrdup and check its return value
nd_btt: Make BTT lanes preemptible
crypto: caam/qi2 - fix Chacha20 + Poly1305 self test failure
crypto: caam/jr - fix Chacha20 + Poly1305 self test failure
crypto: qat - increase size of buffers
hid: cp2112: Fix duplicate workqueue initialization
ARM: 9321/1: memset: cast the constant byte to unsigned char
ext4: move 'ix' sanity check to corrent position
ASoC: fsl: mpc5200_dma.c: Fix warning of Function parameter or member not described
IB/mlx5: Fix rdma counter binding for RAW QP
RDMA/hns: Fix uninitialized ucmd in hns_roce_create_qp_common()
RDMA/hns: Fix signed-unsigned mixed comparisons
RDMA/hns: The UD mode can only be configured with DCQCN
ASoC: fsl: Fix PM disable depth imbalance in fsl_easrc_probe
scsi: ufs: core: Leave space for '\0' in utf8 desc string
RDMA/hfi1: Workaround truncation compilation error
hid: cp2112: Fix IRQ shutdown stopping polling for all IRQs on chip
sh: bios: Revive earlyprintk support
Revert "HID: logitech-hidpp: add a module parameter to keep firmware gestures"
HID: logitech-hidpp: Remove HIDPP_QUIRK_NO_HIDINPUT quirk
HID: logitech-hidpp: Don't restart IO, instead defer hid_connect() only
HID: logitech-hidpp: Revert "Don't restart communication if not necessary"
HID: logitech-hidpp: Move get_wireless_feature_index() check to hidpp_connect_event()
ASoC: Intel: Skylake: Fix mem leak when parsing UUIDs fails
padata: Fix refcnt handling in padata_free_shell()
crypto: qat - fix deadlock in backlog processing
ASoC: ams-delta.c: use component after check
mfd: core: Un-constify mfd_cell.of_reg
mfd: core: Ensure disabled devices are skipped without aborting
mfd: dln2: Fix double put in dln2_probe
mfd: arizona-spi: Set pdata.hpdet_channel for ACPI enumerated devs
leds: turris-omnia: Drop unnecessary mutex locking
leds: turris-omnia: Do not use SMBUS calls
leds: pwm: Don't disable the PWM when the LED should be off
leds: trigger: ledtrig-cpu:: Fix 'output may be truncated' issue for 'cpu'
f2fs: compress: fix to avoid use-after-free on dic
f2fs: compress: fix to avoid redundant compress extension
tty: tty_jobctrl: fix pid memleak in disassociate_ctty()
livepatch: Fix missing newline character in klp_resolve_symbols()
dmaengine: idxd: Register dsa_bus_type before registering idxd sub-drivers
usb: dwc2: fix possible NULL pointer dereference caused by driver concurrency
usb: chipidea: Fix DMA overwrite for Tegra
usb: chipidea: Simplify Tegra DMA alignment code
dmaengine: ti: edma: handle irq_of_parse_and_map() errors
misc: st_core: Do not call kfree_skb() under spin_lock_irqsave()
tools: iio: iio_generic_buffer ensure alignment
USB: usbip: fix stub_dev hub disconnect
dmaengine: pxa_dma: Remove an erroneous BUG_ON() in pxad_free_desc()
f2fs: fix to initialize map.m_pblk in f2fs_precache_extents()
powerpc: Only define __parse_fpscr() when required
modpost: fix tee MODULE_DEVICE_TABLE built on big-endian host
powerpc/40x: Remove stale PTE_ATOMIC_UPDATES macro
powerpc/xive: Fix endian conversion size
powerpc/imc-pmu: Use the correct spinlock initializer.
powerpc/pseries: fix potential memory leak in init_cpu_associativity()
xhci: Loosen RPM as default policy to cover for AMD xHC 1.1
usb: host: xhci-plat: fix possible kernel oops while resuming
perf machine: Avoid out of bounds LBR memory read
perf hist: Add missing puts to hist__account_cycles
9p/net: fix possible memory leak in p9_check_errors()
i3c: Fix potential refcount leak in i3c_master_register_new_i3c_devs
cxl/mem: Fix shutdown order
rtc: pcf85363: fix wrong mask/val parameters in regmap_update_bits call
pcmcia: cs: fix possible hung task and memory leak pccardd()
pcmcia: ds: fix refcount leak in pcmcia_device_add()
pcmcia: ds: fix possible name leak in error path in pcmcia_device_add()
media: i2c: max9286: Fix some redundant of_node_put() calls
media: bttv: fix use after free error due to btv->timeout timer
media: s3c-camif: Avoid inappropriate kfree()
media: vidtv: psi: Add check for kstrdup
media: vidtv: mux: Add check and kfree for kstrdup
media: cedrus: Fix clock/reset sequence
media: dvb-usb-v2: af9035: fix missing unlock
regmap: prevent noinc writes from clobbering cache
pwm: sti: Reduce number of allocations and drop usage of chip_data
pwm: brcmstb: Utilize appropriate clock APIs in suspend/resume
Input: synaptics-rmi4 - fix use after free in rmi_unregister_function()
llc: verify mac len before reading mac header
hsr: Prevent use after free in prp_create_tagged_frame()
tipc: Change nla_policy for bearer-related names to NLA_NUL_STRING
bpf: Check map->usercnt after timer->timer is assigned
inet: shrink struct flowi_common
octeontx2-pf: Fix error codes
octeontx2-pf: Fix holes in error code
dccp: Call security_inet_conn_request() after setting IPv4 addresses.
dccp/tcp: Call security_inet_conn_request() after setting IPv6 addresses.
net: r8169: Disable multicast filter for RTL8168H and RTL8107E
Fix termination state for idr_for_each_entry_ul()
net: stmmac: xgmac: Enable support for multiple Flexible PPS outputs
selftests: pmtu.sh: fix result checking
net/smc: fix dangling sock under state SMC_APPFINCLOSEWAIT
net/smc: allow cdc msg send rather than drop it with NULL sndbuf_desc
net/smc: put sk reference if close work was canceled
tg3: power down device only on SYSTEM_POWER_OFF
block: remove unneeded return value of bio_check_ro()
blk-core: use pr_warn_ratelimited() in bio_check_ro()
r8169: respect userspace disabling IFF_MULTICAST
i2c: iproc: handle invalid slave state
netfilter: xt_recent: fix (increase) ipv6 literal buffer length
netfilter: nft_redir: use `struct nf_nat_range2` throughout and deduplicate eval call-backs
netfilter: nat: fix ipv6 nat redirect with mapped and scoped addresses
drm/syncobj: fix DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE
ASoC: hdmi-codec: register hpd callback on component probe
spi: spi-zynq-qspi: add spi-mem to driver kconfig dependencies
fbdev: imsttfb: Fix error path of imsttfb_probe()
fbdev: imsttfb: fix a resource leak in probe
fbdev: fsl-diu-fb: mark wr_reg_wa() static
tracing/kprobes: Fix the order of argument descriptions
Revert "mmc: core: Capture correct oemid-bits for eMMC cards"
btrfs: use u64 for buffer sizes in the tree search ioctls
Linux 5.15.139
Change-Id: Ia85a72dc6377c9eebcccc33068752ea14c2b584c
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 5
|
||||
PATCHLEVEL = 15
|
||||
SUBLEVEL = 138
|
||||
SUBLEVEL = 139
|
||||
EXTRAVERSION =
|
||||
NAME = Trick or Treat
|
||||
|
||||
|
||||
@@ -82,14 +82,12 @@
|
||||
};
|
||||
};
|
||||
|
||||
regulators {
|
||||
vsdcc_fixed: vsdcc-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "SDCC Power";
|
||||
regulator-min-microvolt = <2700000>;
|
||||
regulator-max-microvolt = <2700000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
vsdcc_fixed: vsdcc-regulator {
|
||||
compatible = "regulator-fixed";
|
||||
regulator-name = "SDCC Power";
|
||||
regulator-min-microvolt = <2700000>;
|
||||
regulator-max-microvolt = <2700000>;
|
||||
regulator-always-on;
|
||||
};
|
||||
|
||||
soc: soc {
|
||||
|
||||
@@ -239,7 +239,7 @@
|
||||
};
|
||||
|
||||
keyboard_pins: keyboard {
|
||||
pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_02";
|
||||
pins = "GP_3_10", "GP_3_11", "GP_3_12", "GP_3_15", "GP_11_2";
|
||||
bias-pull-up;
|
||||
};
|
||||
|
||||
|
||||
@@ -17,6 +17,7 @@ ENTRY(__memset)
|
||||
ENTRY(mmioset)
|
||||
WEAK(memset)
|
||||
UNWIND( .fnstart )
|
||||
and r1, r1, #255 @ cast to unsigned char
|
||||
ands r3, r0, #3 @ 1 unaligned?
|
||||
mov ip, r0 @ preserve r0 as return value
|
||||
bne 6f @ 1
|
||||
|
||||
@@ -159,9 +159,6 @@ static int xen_starting_cpu(unsigned int cpu)
|
||||
BUG_ON(err);
|
||||
per_cpu(xen_vcpu, cpu) = vcpup;
|
||||
|
||||
if (!xen_kernel_unmapped_at_usr())
|
||||
xen_setup_runstate_info(cpu);
|
||||
|
||||
after_register_vcpu_info:
|
||||
enable_percpu_irq(xen_events_irq, 0);
|
||||
return 0;
|
||||
@@ -394,9 +391,6 @@ static int __init xen_guest_init(void)
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (!xen_kernel_unmapped_at_usr())
|
||||
xen_time_setup_guest();
|
||||
|
||||
if (xen_initial_domain())
|
||||
pvclock_gtod_register_notifier(&xen_pvclock_gtod_notifier);
|
||||
|
||||
@@ -406,7 +400,13 @@ static int __init xen_guest_init(void)
|
||||
}
|
||||
early_initcall(xen_guest_init);
|
||||
|
||||
static int __init xen_pm_init(void)
|
||||
static int xen_starting_runstate_cpu(unsigned int cpu)
|
||||
{
|
||||
xen_setup_runstate_info(cpu);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int __init xen_late_init(void)
|
||||
{
|
||||
if (!xen_domain())
|
||||
return -ENODEV;
|
||||
@@ -419,9 +419,16 @@ static int __init xen_pm_init(void)
|
||||
do_settimeofday64(&ts);
|
||||
}
|
||||
|
||||
return 0;
|
||||
if (xen_kernel_unmapped_at_usr())
|
||||
return 0;
|
||||
|
||||
xen_time_setup_guest();
|
||||
|
||||
return cpuhp_setup_state(CPUHP_AP_ARM_XEN_RUNSTATE_STARTING,
|
||||
"arm/xen_runstate:starting",
|
||||
xen_starting_runstate_cpu, NULL);
|
||||
}
|
||||
late_initcall(xen_pm_init);
|
||||
late_initcall(xen_late_init);
|
||||
|
||||
|
||||
/* empty stubs */
|
||||
|
||||
@@ -366,6 +366,7 @@
|
||||
"pll8k", "pll11k", "clkext3";
|
||||
dmas = <&sdma2 24 25 0x80000000>;
|
||||
dma-names = "rx";
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -340,6 +340,7 @@
|
||||
"pll8k", "pll11k", "clkext3";
|
||||
dmas = <&sdma2 24 25 0x80000000>;
|
||||
dma-names = "rx";
|
||||
#sound-dai-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -8,5 +8,5 @@
|
||||
};
|
||||
|
||||
&jpegenc {
|
||||
compatible = "nxp,imx8qm-jpgdec", "nxp,imx8qxp-jpgenc";
|
||||
compatible = "nxp,imx8qm-jpgenc", "nxp,imx8qxp-jpgenc";
|
||||
};
|
||||
|
||||
@@ -107,7 +107,7 @@
|
||||
"mpp59", "mpp60", "mpp61";
|
||||
marvell,function = "sdio";
|
||||
};
|
||||
cp0_spi0_pins: cp0-spi-pins-0 {
|
||||
cp0_spi1_pins: cp0-spi-pins-1 {
|
||||
marvell,pins = "mpp13", "mpp14", "mpp15", "mpp16";
|
||||
marvell,function = "spi1";
|
||||
};
|
||||
@@ -149,7 +149,7 @@
|
||||
|
||||
&cp0_spi1 {
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_spi0_pins>;
|
||||
pinctrl-0 = <&cp0_spi1_pins>;
|
||||
reg = <0x700680 0x50>, /* control */
|
||||
<0x2000000 0x1000000>; /* CS0 */
|
||||
status = "okay";
|
||||
|
||||
@@ -307,7 +307,7 @@
|
||||
&cp0_spi1 {
|
||||
status = "disabled";
|
||||
pinctrl-names = "default";
|
||||
pinctrl-0 = <&cp0_spi0_pins>;
|
||||
pinctrl-0 = <&cp0_spi1_pins>;
|
||||
reg = <0x700680 0x50>;
|
||||
|
||||
spi-flash@0 {
|
||||
@@ -371,7 +371,7 @@
|
||||
"mpp59", "mpp60", "mpp61";
|
||||
marvell,function = "sdio";
|
||||
};
|
||||
cp0_spi0_pins: cp0-spi-pins-0 {
|
||||
cp0_spi1_pins: cp0-spi-pins-1 {
|
||||
marvell,pins = "mpp13", "mpp14", "mpp15", "mpp16";
|
||||
marvell,function = "spi1";
|
||||
};
|
||||
|
||||
@@ -190,6 +190,9 @@
|
||||
pd-gpios = <&msmgpio 32 GPIO_ACTIVE_HIGH>;
|
||||
|
||||
avdd-supply = <&pm8916_l6>;
|
||||
a2vdd-supply = <&pm8916_l6>;
|
||||
dvdd-supply = <&pm8916_l6>;
|
||||
pvdd-supply = <&pm8916_l6>;
|
||||
v1p2-supply = <&pm8916_l6>;
|
||||
v3p3-supply = <&pm8916_l17>;
|
||||
|
||||
|
||||
@@ -1233,7 +1233,7 @@
|
||||
#size-cells = <1>;
|
||||
#iommu-cells = <1>;
|
||||
compatible = "qcom,msm8916-iommu", "qcom,msm-iommu-v1";
|
||||
ranges = <0 0x01e20000 0x40000>;
|
||||
ranges = <0 0x01e20000 0x20000>;
|
||||
reg = <0x01ef0000 0x3000>;
|
||||
clocks = <&gcc GCC_SMMU_CFG_CLK>,
|
||||
<&gcc GCC_APSS_TCU_CLK>;
|
||||
|
||||
@@ -99,11 +99,6 @@
|
||||
qcom,client-id = <1>;
|
||||
};
|
||||
|
||||
audio_mem: audio@cb400000 {
|
||||
reg = <0 0xcb000000 0 0x400000>;
|
||||
no-mem;
|
||||
};
|
||||
|
||||
qseecom_mem: qseecom@cb400000 {
|
||||
reg = <0 0xcb400000 0 0x1c00000>;
|
||||
no-mem;
|
||||
|
||||
@@ -1851,6 +1851,14 @@
|
||||
reg = <0 0x18591000 0 0x1000>,
|
||||
<0 0x18592000 0 0x1000>,
|
||||
<0 0x18593000 0 0x1000>;
|
||||
|
||||
interrupts = <GIC_SPI 30 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 31 IRQ_TYPE_LEVEL_HIGH>,
|
||||
<GIC_SPI 19 IRQ_TYPE_LEVEL_HIGH>;
|
||||
interrupt-names = "dcvsh-irq-0",
|
||||
"dcvsh-irq-1",
|
||||
"dcvsh-irq-2";
|
||||
|
||||
clocks = <&rpmhcc RPMH_CXO_CLK>, <&gcc GCC_GPLL0>;
|
||||
clock-names = "xo", "alternate";
|
||||
#freq-domain-cells = <1>;
|
||||
|
||||
@@ -572,6 +572,8 @@
|
||||
vdd-1.8-xo-supply = <&vreg_l7a_1p8>;
|
||||
vdd-1.3-rfa-supply = <&vreg_l17a_1p3>;
|
||||
vdd-3.3-ch0-supply = <&vreg_l25a_3p3>;
|
||||
|
||||
qcom,snoc-host-cap-8bit-quirk;
|
||||
};
|
||||
|
||||
/* PINCTRL - additions to nodes defined in sdm845.dtsi */
|
||||
|
||||
@@ -69,9 +69,6 @@
|
||||
|
||||
#define _PTE_NONE_MASK 0
|
||||
|
||||
/* Until my rework is finished, 40x still needs atomic PTE updates */
|
||||
#define PTE_ATOMIC_UPDATES 1
|
||||
|
||||
#define _PAGE_BASE_NC (_PAGE_PRESENT | _PAGE_ACCESSED)
|
||||
#define _PAGE_BASE (_PAGE_BASE_NC)
|
||||
|
||||
|
||||
@@ -1148,6 +1148,7 @@ static void emulate_single_step(struct pt_regs *regs)
|
||||
__single_step_exception(regs);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PPC_FPU_REGS
|
||||
static inline int __parse_fpscr(unsigned long fpscr)
|
||||
{
|
||||
int ret = FPE_FLTUNK;
|
||||
@@ -1174,6 +1175,7 @@ static inline int __parse_fpscr(unsigned long fpscr)
|
||||
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
static void parse_fpe(struct pt_regs *regs)
|
||||
{
|
||||
|
||||
@@ -50,7 +50,7 @@ static int trace_imc_mem_size;
|
||||
* core and trace-imc
|
||||
*/
|
||||
static struct imc_pmu_ref imc_global_refc = {
|
||||
.lock = __SPIN_LOCK_INITIALIZER(imc_global_refc.lock),
|
||||
.lock = __SPIN_LOCK_UNLOCKED(imc_global_refc.lock),
|
||||
.id = 0,
|
||||
.refc = 0,
|
||||
};
|
||||
|
||||
@@ -524,8 +524,10 @@ static ssize_t vcpudispatch_stats_write(struct file *file, const char __user *p,
|
||||
|
||||
if (cmd) {
|
||||
rc = init_cpu_associativity();
|
||||
if (rc)
|
||||
if (rc) {
|
||||
destroy_cpu_associativity();
|
||||
goto out;
|
||||
}
|
||||
|
||||
for_each_possible_cpu(cpu) {
|
||||
disp = per_cpu_ptr(&vcpu_disp_data, cpu);
|
||||
|
||||
@@ -786,7 +786,7 @@ int xive_native_get_queue_info(u32 vp_id, u32 prio,
|
||||
if (out_qpage)
|
||||
*out_qpage = be64_to_cpu(qpage);
|
||||
if (out_qsize)
|
||||
*out_qsize = be32_to_cpu(qsize);
|
||||
*out_qsize = be64_to_cpu(qsize);
|
||||
if (out_qeoi_page)
|
||||
*out_qeoi_page = be64_to_cpu(qeoi_page);
|
||||
if (out_escalate_irq)
|
||||
|
||||
@@ -22,6 +22,17 @@ config STACK_DEBUG
|
||||
every function call and will therefore incur a major
|
||||
performance hit. Most users should say N.
|
||||
|
||||
config EARLY_PRINTK
|
||||
bool "Early printk"
|
||||
depends on SH_STANDARD_BIOS
|
||||
help
|
||||
Say Y here to redirect kernel printk messages to the serial port
|
||||
used by the SH-IPL bootloader, starting very early in the boot
|
||||
process and ending when the kernel's serial console is initialised.
|
||||
This option is only useful while porting the kernel to a new machine,
|
||||
when the kernel may crash or hang before the serial console is
|
||||
initialised. If unsure, say N.
|
||||
|
||||
config 4KSTACKS
|
||||
bool "Use 4Kb for kernel stacks instead of 8Kb"
|
||||
depends on DEBUG_KERNEL && (MMU || BROKEN) && !PAGE_SIZE_64KB
|
||||
|
||||
@@ -1360,20 +1360,10 @@ static void pt_addr_filters_fini(struct perf_event *event)
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
static u64 canonical_address(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
|
||||
}
|
||||
|
||||
static u64 is_canonical_address(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return canonical_address(vaddr, vaddr_bits) == vaddr;
|
||||
}
|
||||
|
||||
/* Clamp to a canonical address greater-than-or-equal-to the address given */
|
||||
static u64 clamp_to_ge_canonical_addr(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return is_canonical_address(vaddr, vaddr_bits) ?
|
||||
return __is_canonical_address(vaddr, vaddr_bits) ?
|
||||
vaddr :
|
||||
-BIT_ULL(vaddr_bits - 1);
|
||||
}
|
||||
@@ -1381,7 +1371,7 @@ static u64 clamp_to_ge_canonical_addr(u64 vaddr, u8 vaddr_bits)
|
||||
/* Clamp to a canonical address less-than-or-equal-to the address given */
|
||||
static u64 clamp_to_le_canonical_addr(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return is_canonical_address(vaddr, vaddr_bits) ?
|
||||
return __is_canonical_address(vaddr, vaddr_bits) ?
|
||||
vaddr :
|
||||
BIT_ULL(vaddr_bits - 1) - 1;
|
||||
}
|
||||
|
||||
@@ -71,6 +71,16 @@ static inline void copy_user_page(void *to, void *from, unsigned long vaddr,
|
||||
extern bool __virt_addr_valid(unsigned long kaddr);
|
||||
#define virt_addr_valid(kaddr) __virt_addr_valid((unsigned long) (kaddr))
|
||||
|
||||
static __always_inline u64 __canonical_address(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
|
||||
}
|
||||
|
||||
static __always_inline u64 __is_canonical_address(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return __canonical_address(vaddr, vaddr_bits) == vaddr;
|
||||
}
|
||||
|
||||
#endif /* __ASSEMBLY__ */
|
||||
|
||||
#include <asm-generic/memory_model.h>
|
||||
|
||||
@@ -543,7 +543,7 @@ copy_mc_to_kernel(void *to, const void *from, unsigned len);
|
||||
#define copy_mc_to_kernel copy_mc_to_kernel
|
||||
|
||||
unsigned long __must_check
|
||||
copy_mc_to_user(void *to, const void *from, unsigned len);
|
||||
copy_mc_to_user(void __user *to, const void *from, unsigned len);
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
||||
@@ -2477,7 +2477,7 @@ static void __init srso_select_mitigation(void)
|
||||
pr_info("%s%s\n", srso_strings[srso_mitigation], (has_microcode ? "" : ", no microcode"));
|
||||
|
||||
pred_cmd:
|
||||
if ((boot_cpu_has(X86_FEATURE_SRSO_NO) || srso_cmd == SRSO_CMD_OFF) &&
|
||||
if ((!boot_cpu_has_bug(X86_BUG_SRSO) || srso_cmd == SRSO_CMD_OFF) &&
|
||||
boot_cpu_has(X86_FEATURE_SBPB))
|
||||
x86_pred_cmd = PRED_CMD_SBPB;
|
||||
}
|
||||
|
||||
@@ -79,7 +79,7 @@ static struct desc_struct startup_gdt[GDT_ENTRIES] = {
|
||||
* while the kernel still uses a direct mapping.
|
||||
*/
|
||||
static struct desc_ptr startup_gdt_descr = {
|
||||
.size = sizeof(startup_gdt),
|
||||
.size = sizeof(startup_gdt)-1,
|
||||
.address = 0,
|
||||
};
|
||||
|
||||
|
||||
@@ -687,7 +687,7 @@ static inline u8 ctxt_virt_addr_bits(struct x86_emulate_ctxt *ctxt)
|
||||
static inline bool emul_is_noncanonical_address(u64 la,
|
||||
struct x86_emulate_ctxt *ctxt)
|
||||
{
|
||||
return get_canonical(la, ctxt_virt_addr_bits(ctxt)) != la;
|
||||
return !__is_canonical_address(la, ctxt_virt_addr_bits(ctxt));
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -737,7 +737,7 @@ static __always_inline int __linearize(struct x86_emulate_ctxt *ctxt,
|
||||
case X86EMUL_MODE_PROT64:
|
||||
*linear = la;
|
||||
va_bits = ctxt_virt_addr_bits(ctxt);
|
||||
if (get_canonical(la, va_bits) != la)
|
||||
if (!__is_canonical_address(la, va_bits))
|
||||
goto bad;
|
||||
|
||||
*max_size = min_t(u64, ~0u, (1ull << va_bits) - la);
|
||||
|
||||
@@ -1745,7 +1745,7 @@ static int __kvm_set_msr(struct kvm_vcpu *vcpu, u32 index, u64 data,
|
||||
* value, and that something deterministic happens if the guest
|
||||
* invokes 64-bit SYSENTER.
|
||||
*/
|
||||
data = get_canonical(data, vcpu_virt_addr_bits(vcpu));
|
||||
data = __canonical_address(data, vcpu_virt_addr_bits(vcpu));
|
||||
break;
|
||||
case MSR_TSC_AUX:
|
||||
if (!kvm_is_supported_user_return_msr(MSR_TSC_AUX))
|
||||
|
||||
@@ -211,14 +211,9 @@ static inline u8 vcpu_virt_addr_bits(struct kvm_vcpu *vcpu)
|
||||
return kvm_read_cr4_bits(vcpu, X86_CR4_LA57) ? 57 : 48;
|
||||
}
|
||||
|
||||
static inline u64 get_canonical(u64 la, u8 vaddr_bits)
|
||||
{
|
||||
return ((int64_t)la << (64 - vaddr_bits)) >> (64 - vaddr_bits);
|
||||
}
|
||||
|
||||
static inline bool is_noncanonical_address(u64 la, struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return get_canonical(la, vcpu_virt_addr_bits(vcpu)) != la;
|
||||
return !__is_canonical_address(la, vcpu_virt_addr_bits(vcpu));
|
||||
}
|
||||
|
||||
static inline void vcpu_cache_mmio_info(struct kvm_vcpu *vcpu,
|
||||
|
||||
@@ -70,23 +70,23 @@ unsigned long __must_check copy_mc_to_kernel(void *dst, const void *src, unsigne
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(copy_mc_to_kernel);
|
||||
|
||||
unsigned long __must_check copy_mc_to_user(void *dst, const void *src, unsigned len)
|
||||
unsigned long __must_check copy_mc_to_user(void __user *dst, const void *src, unsigned len)
|
||||
{
|
||||
unsigned long ret;
|
||||
|
||||
if (copy_mc_fragile_enabled) {
|
||||
__uaccess_begin();
|
||||
ret = copy_mc_fragile(dst, src, len);
|
||||
ret = copy_mc_fragile((__force void *)dst, src, len);
|
||||
__uaccess_end();
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (static_cpu_has(X86_FEATURE_ERMS)) {
|
||||
__uaccess_begin();
|
||||
ret = copy_mc_enhanced_fast_string(dst, src, len);
|
||||
ret = copy_mc_enhanced_fast_string((__force void *)dst, src, len);
|
||||
__uaccess_end();
|
||||
return ret;
|
||||
}
|
||||
|
||||
return copy_user_generic(dst, src, len);
|
||||
return copy_user_generic((__force void *)dst, src, len);
|
||||
}
|
||||
|
||||
@@ -4,22 +4,26 @@
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
static __always_inline u64 canonical_address(u64 vaddr, u8 vaddr_bits)
|
||||
{
|
||||
return ((s64)vaddr << (64 - vaddr_bits)) >> (64 - vaddr_bits);
|
||||
}
|
||||
|
||||
bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)
|
||||
{
|
||||
unsigned long vaddr = (unsigned long)unsafe_src;
|
||||
|
||||
/*
|
||||
* Range covering the highest possible canonical userspace address
|
||||
* as well as non-canonical address range. For the canonical range
|
||||
* we also need to include the userspace guard page.
|
||||
* Do not allow userspace addresses. This disallows
|
||||
* normal userspace and the userspace guard page:
|
||||
*/
|
||||
return vaddr >= TASK_SIZE_MAX + PAGE_SIZE &&
|
||||
canonical_address(vaddr, boot_cpu_data.x86_virt_bits) == vaddr;
|
||||
if (vaddr < TASK_SIZE_MAX + PAGE_SIZE)
|
||||
return false;
|
||||
|
||||
/*
|
||||
* Allow everything during early boot before 'x86_virt_bits'
|
||||
* is initialized. Needed for instruction decoding in early
|
||||
* exception handlers.
|
||||
*/
|
||||
if (!boot_cpu_data.x86_virt_bits)
|
||||
return true;
|
||||
|
||||
return __is_canonical_address(vaddr, boot_cpu_data.x86_virt_bits);
|
||||
}
|
||||
#else
|
||||
bool copy_from_kernel_nofault_allowed(const void *unsafe_src, size_t size)
|
||||
|
||||
@@ -695,18 +695,15 @@ static inline bool should_fail_request(struct block_device *part,
|
||||
|
||||
#endif /* CONFIG_FAIL_MAKE_REQUEST */
|
||||
|
||||
static inline bool bio_check_ro(struct bio *bio)
|
||||
static inline void bio_check_ro(struct bio *bio)
|
||||
{
|
||||
if (op_is_write(bio_op(bio)) && bdev_read_only(bio->bi_bdev)) {
|
||||
if (op_is_flush(bio->bi_opf) && !bio_sectors(bio))
|
||||
return false;
|
||||
pr_warn("Trying to write to read-only block-device %pg\n",
|
||||
bio->bi_bdev);
|
||||
return;
|
||||
pr_warn_ratelimited("Trying to write to read-only block-device %pg\n",
|
||||
bio->bi_bdev);
|
||||
/* Older lvm-tools actually trigger this */
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
static noinline int should_fail_bio(struct bio *bio)
|
||||
@@ -812,8 +809,7 @@ static noinline_for_stack bool submit_bio_checks(struct bio *bio)
|
||||
|
||||
if (should_fail_bio(bio))
|
||||
goto end_io;
|
||||
if (unlikely(bio_check_ro(bio)))
|
||||
goto end_io;
|
||||
bio_check_ro(bio);
|
||||
if (!bio_flagged(bio, BIO_REMAPPED)) {
|
||||
if (unlikely(bio_check_eod(bio)))
|
||||
goto end_io;
|
||||
|
||||
@@ -157,8 +157,8 @@ static int create_pnp_modalias(struct acpi_device *acpi_dev, char *modalias,
|
||||
return 0;
|
||||
|
||||
len = snprintf(modalias, size, "acpi:");
|
||||
if (len <= 0)
|
||||
return len;
|
||||
if (len >= size)
|
||||
return -ENOMEM;
|
||||
|
||||
size -= len;
|
||||
|
||||
@@ -211,8 +211,10 @@ static int create_of_modalias(struct acpi_device *acpi_dev, char *modalias,
|
||||
len = snprintf(modalias, size, "of:N%sT", (char *)buf.pointer);
|
||||
ACPI_FREE(buf.pointer);
|
||||
|
||||
if (len <= 0)
|
||||
return len;
|
||||
if (len >= size)
|
||||
return -ENOMEM;
|
||||
|
||||
size -= len;
|
||||
|
||||
of_compatible = acpi_dev->data.of_compatible;
|
||||
if (of_compatible->type == ACPI_TYPE_PACKAGE) {
|
||||
|
||||
@@ -48,7 +48,7 @@ static ssize_t regmap_name_read_file(struct file *file,
|
||||
name = map->dev->driver->name;
|
||||
|
||||
ret = snprintf(buf, PAGE_SIZE, "%s\n", name);
|
||||
if (ret < 0) {
|
||||
if (ret >= PAGE_SIZE) {
|
||||
kfree(buf);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1683,17 +1683,19 @@ static int _regmap_raw_write_impl(struct regmap *map, unsigned int reg,
|
||||
}
|
||||
|
||||
if (!map->cache_bypass && map->format.parse_val) {
|
||||
unsigned int ival;
|
||||
unsigned int ival, offset;
|
||||
int val_bytes = map->format.val_bytes;
|
||||
for (i = 0; i < val_len / val_bytes; i++) {
|
||||
ival = map->format.parse_val(val + (i * val_bytes));
|
||||
ret = regcache_write(map,
|
||||
reg + regmap_get_offset(map, i),
|
||||
ival);
|
||||
|
||||
/* Cache the last written value for noinc writes */
|
||||
i = noinc ? val_len - val_bytes : 0;
|
||||
for (; i < val_len; i += val_bytes) {
|
||||
ival = map->format.parse_val(val + i);
|
||||
offset = noinc ? 0 : regmap_get_offset(map, i / val_bytes);
|
||||
ret = regcache_write(map, reg + offset, ival);
|
||||
if (ret) {
|
||||
dev_err(map->dev,
|
||||
"Error in caching of register: %x ret: %d\n",
|
||||
reg + regmap_get_offset(map, i), ret);
|
||||
reg + offset, ret);
|
||||
return ret;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -58,7 +58,8 @@ struct amd_geode_priv {
|
||||
|
||||
static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
||||
{
|
||||
void __iomem *mem = (void __iomem *)rng->priv;
|
||||
struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv;
|
||||
void __iomem *mem = priv->membase;
|
||||
|
||||
*data = readl(mem + GEODE_RNG_DATA_REG);
|
||||
|
||||
@@ -67,7 +68,8 @@ static int geode_rng_data_read(struct hwrng *rng, u32 *data)
|
||||
|
||||
static int geode_rng_data_present(struct hwrng *rng, int wait)
|
||||
{
|
||||
void __iomem *mem = (void __iomem *)rng->priv;
|
||||
struct amd_geode_priv *priv = (struct amd_geode_priv *)rng->priv;
|
||||
void __iomem *mem = priv->membase;
|
||||
int data, i;
|
||||
|
||||
for (i = 0; i < 20; i++) {
|
||||
|
||||
@@ -539,7 +539,7 @@ static void __init npcm7xx_clk_init(struct device_node *clk_np)
|
||||
return;
|
||||
|
||||
npcm7xx_init_fail:
|
||||
kfree(npcm7xx_clk_data->hws);
|
||||
kfree(npcm7xx_clk_data);
|
||||
npcm7xx_init_np_err:
|
||||
iounmap(clk_base);
|
||||
npcm7xx_init_error:
|
||||
|
||||
@@ -178,6 +178,7 @@ static int scmi_clocks_probe(struct scmi_device *sdev)
|
||||
sclk->info = scmi_proto_clk_ops->info_get(ph, idx);
|
||||
if (!sclk->info) {
|
||||
dev_dbg(dev, "invalid clock info for idx %d\n", idx);
|
||||
devm_kfree(dev, sclk);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,5 +96,6 @@ config CLK_IMX8QXP
|
||||
depends on (ARCH_MXC && ARM64) || COMPILE_TEST
|
||||
depends on IMX_SCU && HAVE_ARM_SMCCC
|
||||
select MXC_CLK_SCU
|
||||
select MXC_CLK
|
||||
help
|
||||
Build the driver for IMX8QXP SCU based clocks.
|
||||
|
||||
@@ -288,8 +288,7 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
|
||||
void __iomem *base;
|
||||
int err;
|
||||
|
||||
clk_hw_data = kzalloc(struct_size(clk_hw_data, hws,
|
||||
IMX8MQ_CLK_END), GFP_KERNEL);
|
||||
clk_hw_data = devm_kzalloc(dev, struct_size(clk_hw_data, hws, IMX8MQ_CLK_END), GFP_KERNEL);
|
||||
if (WARN_ON(!clk_hw_data))
|
||||
return -ENOMEM;
|
||||
|
||||
@@ -306,10 +305,12 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
|
||||
hws[IMX8MQ_CLK_EXT4] = imx_obtain_fixed_clk_hw(np, "clk_ext4");
|
||||
|
||||
np = of_find_compatible_node(NULL, NULL, "fsl,imx8mq-anatop");
|
||||
base = of_iomap(np, 0);
|
||||
base = devm_of_iomap(dev, np, 0, NULL);
|
||||
of_node_put(np);
|
||||
if (WARN_ON(!base))
|
||||
return -ENOMEM;
|
||||
if (WARN_ON(IS_ERR(base))) {
|
||||
err = PTR_ERR(base);
|
||||
goto unregister_hws;
|
||||
}
|
||||
|
||||
hws[IMX8MQ_ARM_PLL_REF_SEL] = imx_clk_hw_mux("arm_pll_ref_sel", base + 0x28, 16, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels));
|
||||
hws[IMX8MQ_GPU_PLL_REF_SEL] = imx_clk_hw_mux("gpu_pll_ref_sel", base + 0x18, 16, 2, pll_ref_sels, ARRAY_SIZE(pll_ref_sels));
|
||||
@@ -395,8 +396,10 @@ static int imx8mq_clocks_probe(struct platform_device *pdev)
|
||||
|
||||
np = dev->of_node;
|
||||
base = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (WARN_ON(IS_ERR(base)))
|
||||
return PTR_ERR(base);
|
||||
if (WARN_ON(IS_ERR(base))) {
|
||||
err = PTR_ERR(base);
|
||||
goto unregister_hws;
|
||||
}
|
||||
|
||||
/* CORE */
|
||||
hws[IMX8MQ_CLK_A53_DIV] = imx8m_clk_hw_composite_core("arm_a53_div", imx8mq_a53_sels, base + 0x8000);
|
||||
|
||||
@@ -148,10 +148,10 @@ static int imx8qxp_clk_probe(struct platform_device *pdev)
|
||||
imx_clk_scu("adc0_clk", IMX_SC_R_ADC_0, IMX_SC_PM_CLK_PER);
|
||||
imx_clk_scu("adc1_clk", IMX_SC_R_ADC_1, IMX_SC_PM_CLK_PER);
|
||||
imx_clk_scu("pwm_clk", IMX_SC_R_LCD_0_PWM_0, IMX_SC_PM_CLK_PER);
|
||||
imx_clk_scu("elcdif_pll", IMX_SC_R_ELCDIF_PLL, IMX_SC_PM_CLK_PLL);
|
||||
imx_clk_scu2("lcd_clk", lcd_sels, ARRAY_SIZE(lcd_sels), IMX_SC_R_LCD_0, IMX_SC_PM_CLK_PER);
|
||||
imx_clk_scu2("lcd_pxl_clk", lcd_pxl_sels, ARRAY_SIZE(lcd_pxl_sels), IMX_SC_R_LCD_0, IMX_SC_PM_CLK_MISC0);
|
||||
imx_clk_scu("lcd_pxl_bypass_div_clk", IMX_SC_R_LCD_0, IMX_SC_PM_CLK_BYPASS);
|
||||
imx_clk_scu("elcdif_pll", IMX_SC_R_ELCDIF_PLL, IMX_SC_PM_CLK_PLL);
|
||||
|
||||
/* Audio SS */
|
||||
imx_clk_scu("audio_pll0_clk", IMX_SC_R_AUDIO_PLL_0, IMX_SC_PM_CLK_PLL);
|
||||
|
||||
@@ -281,12 +281,13 @@ static void __init of_pll_div_clk_init(struct device_node *node)
|
||||
|
||||
clk = clk_register_divider(NULL, clk_name, parent_name, 0, reg, shift,
|
||||
mask, 0, NULL);
|
||||
if (clk) {
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
} else {
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: error registering divider %s\n", __func__, clk_name);
|
||||
iounmap(reg);
|
||||
return;
|
||||
}
|
||||
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
}
|
||||
CLK_OF_DECLARE(pll_divider_clock, "ti,keystone,pll-divider-clock", of_pll_div_clk_init);
|
||||
|
||||
@@ -328,10 +329,12 @@ static void __init of_pll_mux_clk_init(struct device_node *node)
|
||||
clk = clk_register_mux(NULL, clk_name, (const char **)&parents,
|
||||
ARRAY_SIZE(parents) , 0, reg, shift, mask,
|
||||
0, NULL);
|
||||
if (clk)
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
else
|
||||
if (IS_ERR(clk)) {
|
||||
pr_err("%s: error registering mux %s\n", __func__, clk_name);
|
||||
return;
|
||||
}
|
||||
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
}
|
||||
CLK_OF_DECLARE(pll_mux_clock, "ti,keystone,pll-mux-clock", of_pll_mux_clk_init);
|
||||
|
||||
|
||||
@@ -675,6 +675,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_TOP_NR);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
|
||||
clk_data);
|
||||
@@ -742,6 +744,8 @@ static void __init mtk_infrasys_init_early(struct device_node *node)
|
||||
|
||||
if (!infra_clk_data) {
|
||||
infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
|
||||
if (!infra_clk_data)
|
||||
return;
|
||||
|
||||
for (i = 0; i < CLK_INFRA_NR; i++)
|
||||
infra_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
|
||||
@@ -768,6 +772,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
||||
|
||||
if (!infra_clk_data) {
|
||||
infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
|
||||
if (!infra_clk_data)
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
for (i = 0; i < CLK_INFRA_NR; i++) {
|
||||
if (infra_clk_data->clks[i] == ERR_PTR(-EPROBE_DEFER))
|
||||
@@ -896,6 +902,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
|
||||
clk_data);
|
||||
|
||||
@@ -785,6 +785,8 @@ static int clk_mt6765_apmixed_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
|
||||
@@ -820,6 +822,8 @@ static int clk_mt6765_top_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_fixed_clks(fixed_clks, ARRAY_SIZE(fixed_clks),
|
||||
clk_data);
|
||||
@@ -860,6 +864,8 @@ static int clk_mt6765_ifr_probe(struct platform_device *pdev)
|
||||
}
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_IFR_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_gates(node, ifr_clks, ARRAY_SIZE(ifr_clks),
|
||||
clk_data);
|
||||
|
||||
@@ -1217,6 +1217,8 @@ static int clk_mt6779_apmixed_probe(struct platform_device *pdev)
|
||||
struct device_node *node = pdev->dev.of_node;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_APMIXED_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_plls(node, plls, ARRAY_SIZE(plls), clk_data);
|
||||
|
||||
@@ -1237,6 +1239,8 @@ static int clk_mt6779_top_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
|
||||
clk_data);
|
||||
|
||||
@@ -391,6 +391,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_TOP_NR);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_factors(top_fixed_divs, ARRAY_SIZE(top_fixed_divs),
|
||||
clk_data);
|
||||
@@ -563,6 +565,8 @@ static void mtk_infrasys_init_early(struct device_node *node)
|
||||
|
||||
if (!infra_clk_data) {
|
||||
infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
|
||||
if (!infra_clk_data)
|
||||
return;
|
||||
|
||||
for (i = 0; i < CLK_INFRA_NR; i++)
|
||||
infra_clk_data->clks[i] = ERR_PTR(-EPROBE_DEFER);
|
||||
@@ -587,6 +591,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
||||
|
||||
if (!infra_clk_data) {
|
||||
infra_clk_data = mtk_alloc_clk_data(CLK_INFRA_NR);
|
||||
if (!infra_clk_data)
|
||||
return -ENOMEM;
|
||||
} else {
|
||||
for (i = 0; i < CLK_INFRA_NR; i++) {
|
||||
if (infra_clk_data->clks[i] == ERR_PTR(-EPROBE_DEFER))
|
||||
|
||||
@@ -83,6 +83,8 @@ static int clk_mt7629_ethsys_init(struct platform_device *pdev)
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_ETH_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_gates(node, eth_clks, CLK_ETH_NR_CLK, clk_data);
|
||||
|
||||
@@ -105,6 +107,8 @@ static int clk_mt7629_sgmiisys_init(struct platform_device *pdev)
|
||||
int r;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_SGMII_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_gates(node, sgmii_clks[id++], CLK_SGMII_NR_CLK,
|
||||
clk_data);
|
||||
|
||||
@@ -580,6 +580,8 @@ static int mtk_topckgen_init(struct platform_device *pdev)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_TOP_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_fixed_clks(top_fixed_clks, ARRAY_SIZE(top_fixed_clks),
|
||||
clk_data);
|
||||
@@ -603,6 +605,8 @@ static int mtk_infrasys_init(struct platform_device *pdev)
|
||||
struct clk_onecell_data *clk_data;
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_INFRA_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_gates(node, infra_clks, ARRAY_SIZE(infra_clks),
|
||||
clk_data);
|
||||
@@ -626,6 +630,8 @@ static int mtk_pericfg_init(struct platform_device *pdev)
|
||||
return PTR_ERR(base);
|
||||
|
||||
clk_data = mtk_alloc_clk_data(CLK_PERI_NR_CLK);
|
||||
if (!clk_data)
|
||||
return -ENOMEM;
|
||||
|
||||
mtk_clk_register_gates(node, peri_clks, ARRAY_SIZE(peri_clks),
|
||||
clk_data);
|
||||
|
||||
@@ -127,6 +127,7 @@ config IPQ_APSS_6018
|
||||
tristate "IPQ APSS Clock Controller"
|
||||
select IPQ_APSS_PLL
|
||||
depends on QCOM_APCS_IPC || COMPILE_TEST
|
||||
depends on QCOM_SMEM
|
||||
help
|
||||
Support for APSS clock controller on IPQ platforms. The
|
||||
APSS clock controller manages the Mux and enable block that feeds the
|
||||
|
||||
@@ -148,17 +148,11 @@ static int clk_rcg2_set_parent(struct clk_hw *hw, u8 index)
|
||||
static unsigned long
|
||||
calc_rate(unsigned long rate, u32 m, u32 n, u32 mode, u32 hid_div)
|
||||
{
|
||||
if (hid_div) {
|
||||
rate *= 2;
|
||||
rate /= hid_div + 1;
|
||||
}
|
||||
if (hid_div)
|
||||
rate = mult_frac(rate, 2, hid_div + 1);
|
||||
|
||||
if (mode) {
|
||||
u64 tmp = rate;
|
||||
tmp *= m;
|
||||
do_div(tmp, n);
|
||||
rate = tmp;
|
||||
}
|
||||
if (mode)
|
||||
rate = mult_frac(rate, m, n);
|
||||
|
||||
return rate;
|
||||
}
|
||||
|
||||
@@ -792,7 +792,7 @@ static struct clk_rcg2 gcc_sdcc2_apps_clk_src = {
|
||||
.name = "gcc_sdcc2_apps_clk_src",
|
||||
.parent_data = gcc_parents_6,
|
||||
.num_parents = ARRAY_SIZE(gcc_parents_6),
|
||||
.flags = CLK_SET_RATE_PARENT,
|
||||
.flags = CLK_OPS_PARENT_ENABLE,
|
||||
.ops = &clk_rcg2_floor_ops,
|
||||
},
|
||||
};
|
||||
|
||||
@@ -2487,6 +2487,7 @@ static struct clk_branch fd_ahb_clk = {
|
||||
|
||||
static struct clk_branch mnoc_ahb_clk = {
|
||||
.halt_reg = 0x5024,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.clkr = {
|
||||
.enable_reg = 0x5024,
|
||||
.enable_mask = BIT(0),
|
||||
@@ -2502,6 +2503,7 @@ static struct clk_branch mnoc_ahb_clk = {
|
||||
|
||||
static struct clk_branch bimc_smmu_ahb_clk = {
|
||||
.halt_reg = 0xe004,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.hwcg_reg = 0xe004,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
@@ -2519,6 +2521,7 @@ static struct clk_branch bimc_smmu_ahb_clk = {
|
||||
|
||||
static struct clk_branch bimc_smmu_axi_clk = {
|
||||
.halt_reg = 0xe008,
|
||||
.halt_check = BRANCH_HALT_SKIP,
|
||||
.hwcg_reg = 0xe008,
|
||||
.hwcg_bit = 1,
|
||||
.clkr = {
|
||||
@@ -2659,11 +2662,13 @@ static struct gdsc camss_cpp_gdsc = {
|
||||
static struct gdsc bimc_smmu_gdsc = {
|
||||
.gdscr = 0xe020,
|
||||
.gds_hw_ctrl = 0xe024,
|
||||
.cxcs = (unsigned int []){ 0xe008 },
|
||||
.cxc_count = 1,
|
||||
.pd = {
|
||||
.name = "bimc_smmu",
|
||||
},
|
||||
.pwrsts = PWRSTS_OFF_ON,
|
||||
.flags = HW_CTRL | ALWAYS_ON,
|
||||
.flags = VOTABLE,
|
||||
};
|
||||
|
||||
static struct clk_regmap *mmcc_msm8998_clocks[] = {
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
* Copyright (C) 2015 Renesas Electronics Corp.
|
||||
*/
|
||||
|
||||
#include <linux/bitfield.h>
|
||||
#include <linux/clk.h>
|
||||
#include <linux/clk-provider.h>
|
||||
#include <linux/clk/renesas.h>
|
||||
@@ -37,14 +38,13 @@
|
||||
#define WARN_DEBUG(x) do { } while (0)
|
||||
#endif
|
||||
|
||||
#define DIV_RSMASK(v, s, m) ((v >> s) & m)
|
||||
#define GET_SHIFT(val) ((val >> 12) & 0xff)
|
||||
#define GET_WIDTH(val) ((val >> 8) & 0xf)
|
||||
|
||||
#define KDIV(val) DIV_RSMASK(val, 16, 0xffff)
|
||||
#define MDIV(val) DIV_RSMASK(val, 6, 0x3ff)
|
||||
#define PDIV(val) DIV_RSMASK(val, 0, 0x3f)
|
||||
#define SDIV(val) DIV_RSMASK(val, 0, 0x7)
|
||||
#define KDIV(val) ((s16)FIELD_GET(GENMASK(31, 16), val))
|
||||
#define MDIV(val) FIELD_GET(GENMASK(15, 6), val)
|
||||
#define PDIV(val) FIELD_GET(GENMASK(5, 0), val)
|
||||
#define SDIV(val) FIELD_GET(GENMASK(2, 0), val)
|
||||
|
||||
#define CLK_ON_R(reg) (reg)
|
||||
#define CLK_MON_R(reg) (0x180 + (reg))
|
||||
@@ -146,18 +146,18 @@ static unsigned long rzg2l_cpg_pll_clk_recalc_rate(struct clk_hw *hw,
|
||||
struct pll_clk *pll_clk = to_pll(hw);
|
||||
struct rzg2l_cpg_priv *priv = pll_clk->priv;
|
||||
unsigned int val1, val2;
|
||||
unsigned int mult = 1;
|
||||
unsigned int div = 1;
|
||||
u64 rate;
|
||||
|
||||
if (pll_clk->type != CLK_TYPE_SAM_PLL)
|
||||
return parent_rate;
|
||||
|
||||
val1 = readl(priv->base + GET_REG_SAMPLL_CLK1(pll_clk->conf));
|
||||
val2 = readl(priv->base + GET_REG_SAMPLL_CLK2(pll_clk->conf));
|
||||
mult = MDIV(val1) + KDIV(val1) / 65536;
|
||||
div = PDIV(val1) * (1 << SDIV(val2));
|
||||
|
||||
return DIV_ROUND_CLOSEST_ULL((u64)parent_rate * mult, div);
|
||||
rate = mul_u64_u32_shr(parent_rate, (MDIV(val1) << 16) + KDIV(val1),
|
||||
16 + SDIV(val2));
|
||||
|
||||
return DIV_ROUND_CLOSEST_ULL(rate, PDIV(val1));
|
||||
}
|
||||
|
||||
static const struct clk_ops rzg2l_cpg_pll_ops = {
|
||||
|
||||
@@ -139,6 +139,7 @@ static void __init omap_clk_register_apll(void *user,
|
||||
struct clk_hw *hw = user;
|
||||
struct clk_hw_omap *clk_hw = to_clk_hw_omap(hw);
|
||||
struct dpll_data *ad = clk_hw->dpll_data;
|
||||
const char *name;
|
||||
struct clk *clk;
|
||||
const struct clk_init_data *init = clk_hw->hw.init;
|
||||
|
||||
@@ -166,7 +167,8 @@ static void __init omap_clk_register_apll(void *user,
|
||||
|
||||
ad->clk_bypass = __clk_get_hw(clk);
|
||||
|
||||
clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, node->name);
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name);
|
||||
if (!IS_ERR(clk)) {
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
kfree(init->parent_names);
|
||||
@@ -198,7 +200,7 @@ static void __init of_dra7_apll_setup(struct device_node *node)
|
||||
clk_hw->dpll_data = ad;
|
||||
clk_hw->hw.init = init;
|
||||
|
||||
init->name = node->name;
|
||||
init->name = ti_dt_clk_name(node);
|
||||
init->ops = &apll_ck_ops;
|
||||
|
||||
init->num_parents = of_clk_get_parent_count(node);
|
||||
@@ -347,6 +349,7 @@ static void __init of_omap2_apll_setup(struct device_node *node)
|
||||
struct dpll_data *ad = NULL;
|
||||
struct clk_hw_omap *clk_hw = NULL;
|
||||
struct clk_init_data *init = NULL;
|
||||
const char *name;
|
||||
struct clk *clk;
|
||||
const char *parent_name;
|
||||
u32 val;
|
||||
@@ -362,7 +365,8 @@ static void __init of_omap2_apll_setup(struct device_node *node)
|
||||
clk_hw->dpll_data = ad;
|
||||
clk_hw->hw.init = init;
|
||||
init->ops = &omap2_apll_ops;
|
||||
init->name = node->name;
|
||||
name = ti_dt_clk_name(node);
|
||||
init->name = name;
|
||||
clk_hw->ops = &omap2_apll_hwops;
|
||||
|
||||
init->num_parents = of_clk_get_parent_count(node);
|
||||
@@ -403,7 +407,8 @@ static void __init of_omap2_apll_setup(struct device_node *node)
|
||||
if (ret)
|
||||
goto cleanup;
|
||||
|
||||
clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, node->name);
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name);
|
||||
if (!IS_ERR(clk)) {
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
kfree(init);
|
||||
|
||||
@@ -205,7 +205,7 @@ int __init of_ti_clk_autoidle_setup(struct device_node *node)
|
||||
return -ENOMEM;
|
||||
|
||||
clk->shift = shift;
|
||||
clk->name = node->name;
|
||||
clk->name = ti_dt_clk_name(node);
|
||||
ret = ti_clk_get_reg_addr(node, 0, &clk->reg);
|
||||
if (ret) {
|
||||
kfree(clk);
|
||||
|
||||
@@ -173,6 +173,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)
|
||||
struct dra7_atl_desc *clk_hw = NULL;
|
||||
struct clk_init_data init = { NULL };
|
||||
const char **parent_names = NULL;
|
||||
const char *name;
|
||||
struct clk *clk;
|
||||
|
||||
clk_hw = kzalloc(sizeof(*clk_hw), GFP_KERNEL);
|
||||
@@ -183,7 +184,8 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)
|
||||
|
||||
clk_hw->hw.init = &init;
|
||||
clk_hw->divider = 1;
|
||||
init.name = node->name;
|
||||
name = ti_dt_clk_name(node);
|
||||
init.name = name;
|
||||
init.ops = &atl_clk_ops;
|
||||
init.flags = CLK_IGNORE_UNUSED;
|
||||
init.num_parents = of_clk_get_parent_count(node);
|
||||
@@ -203,7 +205,7 @@ static void __init of_dra7_atl_clock_setup(struct device_node *node)
|
||||
|
||||
init.parent_names = parent_names;
|
||||
|
||||
clk = ti_clk_register(NULL, &clk_hw->hw, node->name);
|
||||
clk = of_ti_clk_register(node, &clk_hw->hw, name);
|
||||
|
||||
if (!IS_ERR(clk)) {
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
|
||||
@@ -402,6 +402,24 @@ static const struct of_device_id simple_clk_match_table[] __initconst = {
|
||||
{ }
|
||||
};
|
||||
|
||||
/**
|
||||
* ti_dt_clk_name - init clock name from first output name or node name
|
||||
* @np: device node
|
||||
*
|
||||
* Use the first clock-output-name for the clock name if found. Fall back
|
||||
* to legacy naming based on node name.
|
||||
*/
|
||||
const char *ti_dt_clk_name(struct device_node *np)
|
||||
{
|
||||
const char *name;
|
||||
|
||||
if (!of_property_read_string_index(np, "clock-output-names", 0,
|
||||
&name))
|
||||
return name;
|
||||
|
||||
return np->name;
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_clk_add_aliases - setup clock aliases
|
||||
*
|
||||
@@ -418,7 +436,7 @@ void __init ti_clk_add_aliases(void)
|
||||
clkspec.np = np;
|
||||
clk = of_clk_get_from_provider(&clkspec);
|
||||
|
||||
ti_clk_add_alias(NULL, clk, np->name);
|
||||
ti_clk_add_alias(clk, ti_dt_clk_name(np));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -471,7 +489,6 @@ void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)
|
||||
|
||||
/**
|
||||
* ti_clk_add_alias - add a clock alias for a TI clock
|
||||
* @dev: device alias for this clock
|
||||
* @clk: clock handle to create alias for
|
||||
* @con: connection ID for this clock
|
||||
*
|
||||
@@ -479,7 +496,7 @@ void omap2_clk_enable_init_clocks(const char **clk_names, u8 num_clocks)
|
||||
* and assigns the data to it. Returns 0 if successful, negative error
|
||||
* value otherwise.
|
||||
*/
|
||||
int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)
|
||||
int ti_clk_add_alias(struct clk *clk, const char *con)
|
||||
{
|
||||
struct clk_lookup *cl;
|
||||
|
||||
@@ -493,8 +510,6 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)
|
||||
if (!cl)
|
||||
return -ENOMEM;
|
||||
|
||||
if (dev)
|
||||
cl->dev_id = dev_name(dev);
|
||||
cl->con_id = con;
|
||||
cl->clk = clk;
|
||||
|
||||
@@ -504,8 +519,8 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_clk_register - register a TI clock to the common clock framework
|
||||
* @dev: device for this clock
|
||||
* of_ti_clk_register - register a TI clock to the common clock framework
|
||||
* @node: device node for this clock
|
||||
* @hw: hardware clock handle
|
||||
* @con: connection ID for this clock
|
||||
*
|
||||
@@ -513,17 +528,18 @@ int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con)
|
||||
* alias for it. Returns a handle to the registered clock if successful,
|
||||
* ERR_PTR value in failure.
|
||||
*/
|
||||
struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,
|
||||
const char *con)
|
||||
struct clk *of_ti_clk_register(struct device_node *node, struct clk_hw *hw,
|
||||
const char *con)
|
||||
{
|
||||
struct clk *clk;
|
||||
int ret;
|
||||
|
||||
clk = clk_register(dev, hw);
|
||||
if (IS_ERR(clk))
|
||||
return clk;
|
||||
ret = of_clk_hw_register(node, hw);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
ret = ti_clk_add_alias(dev, clk, con);
|
||||
clk = hw->clk;
|
||||
ret = ti_clk_add_alias(clk, con);
|
||||
if (ret) {
|
||||
clk_unregister(clk);
|
||||
return ERR_PTR(ret);
|
||||
@@ -533,8 +549,8 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework
|
||||
* @dev: device for this clock
|
||||
* of_ti_clk_register_omap_hw - register a clk_hw_omap to the clock framework
|
||||
* @node: device node for this clock
|
||||
* @hw: hardware clock handle
|
||||
* @con: connection ID for this clock
|
||||
*
|
||||
@@ -543,13 +559,13 @@ struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,
|
||||
* Returns a handle to the registered clock if successful, ERR_PTR value
|
||||
* in failure.
|
||||
*/
|
||||
struct clk *ti_clk_register_omap_hw(struct device *dev, struct clk_hw *hw,
|
||||
const char *con)
|
||||
struct clk *of_ti_clk_register_omap_hw(struct device_node *node,
|
||||
struct clk_hw *hw, const char *con)
|
||||
{
|
||||
struct clk *clk;
|
||||
struct clk_hw_omap *oclk;
|
||||
|
||||
clk = ti_clk_register(dev, hw, con);
|
||||
clk = of_ti_clk_register(node, hw, con);
|
||||
if (IS_ERR(clk))
|
||||
return clk;
|
||||
|
||||
|
||||
@@ -317,7 +317,7 @@ _ti_clkctrl_clk_register(struct omap_clkctrl_provider *provider,
|
||||
init.ops = ops;
|
||||
init.flags = 0;
|
||||
|
||||
clk = ti_clk_register(NULL, clk_hw, init.name);
|
||||
clk = of_ti_clk_register(node, clk_hw, init.name);
|
||||
if (IS_ERR_OR_NULL(clk)) {
|
||||
ret = -EINVAL;
|
||||
goto cleanup;
|
||||
@@ -701,7 +701,7 @@ clkdm_found:
|
||||
init.ops = &omap4_clkctrl_clk_ops;
|
||||
hw->hw.init = &init;
|
||||
|
||||
clk = ti_clk_register_omap_hw(NULL, &hw->hw, init.name);
|
||||
clk = of_ti_clk_register_omap_hw(node, &hw->hw, init.name);
|
||||
if (IS_ERR_OR_NULL(clk))
|
||||
goto cleanup;
|
||||
|
||||
|
||||
@@ -210,11 +210,12 @@ extern const struct omap_clkctrl_data dm816_clkctrl_data[];
|
||||
|
||||
typedef void (*ti_of_clk_init_cb_t)(void *, struct device_node *);
|
||||
|
||||
struct clk *ti_clk_register(struct device *dev, struct clk_hw *hw,
|
||||
const char *con);
|
||||
struct clk *ti_clk_register_omap_hw(struct device *dev, struct clk_hw *hw,
|
||||
const char *con);
|
||||
int ti_clk_add_alias(struct device *dev, struct clk *clk, const char *con);
|
||||
struct clk *of_ti_clk_register(struct device_node *node, struct clk_hw *hw,
|
||||
const char *con);
|
||||
struct clk *of_ti_clk_register_omap_hw(struct device_node *node,
|
||||
struct clk_hw *hw, const char *con);
|
||||
const char *ti_dt_clk_name(struct device_node *np);
|
||||
int ti_clk_add_alias(struct clk *clk, const char *con);
|
||||
void ti_clk_add_aliases(void);
|
||||
|
||||
void ti_clk_latch(struct clk_omap_reg *reg, s8 shift);
|
||||
|
||||
@@ -131,7 +131,7 @@ static void __init of_ti_clockdomain_setup(struct device_node *node)
|
||||
{
|
||||
struct clk *clk;
|
||||
struct clk_hw *clk_hw;
|
||||
const char *clkdm_name = node->name;
|
||||
const char *clkdm_name = ti_dt_clk_name(node);
|
||||
int i;
|
||||
unsigned int num_clks;
|
||||
|
||||
|
||||
@@ -125,6 +125,7 @@ static void __init _register_composite(void *user,
|
||||
struct component_clk *comp;
|
||||
int num_parents = 0;
|
||||
const char **parent_names = NULL;
|
||||
const char *name;
|
||||
int i;
|
||||
int ret;
|
||||
|
||||
@@ -172,7 +173,8 @@ static void __init _register_composite(void *user,
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
clk = clk_register_composite(NULL, node->name,
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = clk_register_composite(NULL, name,
|
||||
parent_names, num_parents,
|
||||
_get_hw(cclk, CLK_COMPONENT_TYPE_MUX),
|
||||
&ti_clk_mux_ops,
|
||||
@@ -182,7 +184,7 @@ static void __init _register_composite(void *user,
|
||||
&ti_composite_gate_ops, 0);
|
||||
|
||||
if (!IS_ERR(clk)) {
|
||||
ret = ti_clk_add_alias(NULL, clk, node->name);
|
||||
ret = ti_clk_add_alias(clk, name);
|
||||
if (ret) {
|
||||
clk_unregister(clk);
|
||||
goto cleanup;
|
||||
|
||||
@@ -317,13 +317,14 @@ static struct clk *_register_divider(struct device_node *node,
|
||||
u32 flags,
|
||||
struct clk_omap_divider *div)
|
||||
{
|
||||
struct clk *clk;
|
||||
struct clk_init_data init;
|
||||
const char *parent_name;
|
||||
const char *name;
|
||||
|
||||
parent_name = of_clk_get_parent_name(node, 0);
|
||||
|
||||
init.name = node->name;
|
||||
name = ti_dt_clk_name(node);
|
||||
init.name = name;
|
||||
init.ops = &ti_clk_divider_ops;
|
||||
init.flags = flags;
|
||||
init.parent_names = (parent_name ? &parent_name : NULL);
|
||||
@@ -332,12 +333,7 @@ static struct clk *_register_divider(struct device_node *node,
|
||||
div->hw.init = &init;
|
||||
|
||||
/* register the clock */
|
||||
clk = ti_clk_register(NULL, &div->hw, node->name);
|
||||
|
||||
if (IS_ERR(clk))
|
||||
kfree(div);
|
||||
|
||||
return clk;
|
||||
return of_ti_clk_register(node, &div->hw, name);
|
||||
}
|
||||
|
||||
int ti_clk_parse_divider_data(int *div_table, int num_dividers, int max_div,
|
||||
|
||||
@@ -164,6 +164,7 @@ static void __init _register_dpll(void *user,
|
||||
struct clk_hw *hw = user;
|
||||
struct clk_hw_omap *clk_hw = to_clk_hw_omap(hw);
|
||||
struct dpll_data *dd = clk_hw->dpll_data;
|
||||
const char *name;
|
||||
struct clk *clk;
|
||||
const struct clk_init_data *init = hw->init;
|
||||
|
||||
@@ -193,7 +194,8 @@ static void __init _register_dpll(void *user,
|
||||
dd->clk_bypass = __clk_get_hw(clk);
|
||||
|
||||
/* register the clock */
|
||||
clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, node->name);
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name);
|
||||
|
||||
if (!IS_ERR(clk)) {
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
@@ -227,7 +229,7 @@ static void _register_dpll_x2(struct device_node *node,
|
||||
struct clk *clk;
|
||||
struct clk_init_data init = { NULL };
|
||||
struct clk_hw_omap *clk_hw;
|
||||
const char *name = node->name;
|
||||
const char *name = ti_dt_clk_name(node);
|
||||
const char *parent_name;
|
||||
|
||||
parent_name = of_clk_get_parent_name(node, 0);
|
||||
@@ -265,7 +267,7 @@ static void _register_dpll_x2(struct device_node *node,
|
||||
#endif
|
||||
|
||||
/* register the clock */
|
||||
clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, name);
|
||||
clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name);
|
||||
|
||||
if (IS_ERR(clk))
|
||||
kfree(clk_hw);
|
||||
@@ -304,7 +306,7 @@ static void __init of_ti_dpll_setup(struct device_node *node,
|
||||
clk_hw->ops = &clkhwops_omap3_dpll;
|
||||
clk_hw->hw.init = init;
|
||||
|
||||
init->name = node->name;
|
||||
init->name = ti_dt_clk_name(node);
|
||||
init->ops = ops;
|
||||
|
||||
init->num_parents = of_clk_get_parent_count(node);
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
#include <linux/of_address.h>
|
||||
#include <linux/clk/ti.h>
|
||||
|
||||
#include "clock.h"
|
||||
|
||||
/* FAPLL Control Register PLL_CTRL */
|
||||
#define FAPLL_MAIN_MULT_N_SHIFT 16
|
||||
#define FAPLL_MAIN_DIV_P_SHIFT 8
|
||||
@@ -542,6 +544,7 @@ static void __init ti_fapll_setup(struct device_node *node)
|
||||
struct clk_init_data *init = NULL;
|
||||
const char *parent_name[2];
|
||||
struct clk *pll_clk;
|
||||
const char *name;
|
||||
int i;
|
||||
|
||||
fd = kzalloc(sizeof(*fd), GFP_KERNEL);
|
||||
@@ -559,7 +562,8 @@ static void __init ti_fapll_setup(struct device_node *node)
|
||||
goto free;
|
||||
|
||||
init->ops = &ti_fapll_ops;
|
||||
init->name = node->name;
|
||||
name = ti_dt_clk_name(node);
|
||||
init->name = name;
|
||||
|
||||
init->num_parents = of_clk_get_parent_count(node);
|
||||
if (init->num_parents != 2) {
|
||||
@@ -591,7 +595,7 @@ static void __init ti_fapll_setup(struct device_node *node)
|
||||
if (fapll_is_ddr_pll(fd->base))
|
||||
fd->bypass_bit_inverted = true;
|
||||
|
||||
fd->name = node->name;
|
||||
fd->name = name;
|
||||
fd->hw.init = init;
|
||||
|
||||
/* Register the parent PLL */
|
||||
@@ -638,8 +642,7 @@ static void __init ti_fapll_setup(struct device_node *node)
|
||||
freq = NULL;
|
||||
}
|
||||
synth_clk = ti_fapll_synth_setup(fd, freq, div, output_instance,
|
||||
output_name, node->name,
|
||||
pll_clk);
|
||||
output_name, name, pll_clk);
|
||||
if (IS_ERR(synth_clk))
|
||||
continue;
|
||||
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
static void __init of_ti_fixed_factor_clk_setup(struct device_node *node)
|
||||
{
|
||||
struct clk *clk;
|
||||
const char *clk_name = node->name;
|
||||
const char *clk_name = ti_dt_clk_name(node);
|
||||
const char *parent_name;
|
||||
u32 div, mult;
|
||||
u32 flags = 0;
|
||||
@@ -62,7 +62,7 @@ static void __init of_ti_fixed_factor_clk_setup(struct device_node *node)
|
||||
if (!IS_ERR(clk)) {
|
||||
of_clk_add_provider(node, of_clk_src_simple_get, clk);
|
||||
of_ti_clk_autoidle_setup(node);
|
||||
ti_clk_add_alias(NULL, clk, clk_name);
|
||||
ti_clk_add_alias(clk, clk_name);
|
||||
}
|
||||
}
|
||||
CLK_OF_DECLARE(ti_fixed_factor_clk, "ti,fixed-factor-clock",
|
||||
|
||||
@@ -93,7 +93,7 @@ static int omap36xx_gate_clk_enable_with_hsdiv_restore(struct clk_hw *hw)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct clk *_register_gate(struct device *dev, const char *name,
|
||||
static struct clk *_register_gate(struct device_node *node, const char *name,
|
||||
const char *parent_name, unsigned long flags,
|
||||
struct clk_omap_reg *reg, u8 bit_idx,
|
||||
u8 clk_gate_flags, const struct clk_ops *ops,
|
||||
@@ -123,7 +123,7 @@ static struct clk *_register_gate(struct device *dev, const char *name,
|
||||
|
||||
init.flags = flags;
|
||||
|
||||
clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, name);
|
||||
clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name);
|
||||
|
||||
if (IS_ERR(clk))
|
||||
kfree(clk_hw);
|
||||
@@ -138,6 +138,7 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node,
|
||||
struct clk *clk;
|
||||
const char *parent_name;
|
||||
struct clk_omap_reg reg;
|
||||
const char *name;
|
||||
u8 enable_bit = 0;
|
||||
u32 val;
|
||||
u32 flags = 0;
|
||||
@@ -164,7 +165,8 @@ static void __init _of_ti_gate_clk_setup(struct device_node *node,
|
||||
if (of_property_read_bool(node, "ti,set-bit-to-disable"))
|
||||
clk_gate_flags |= INVERT_ENABLE;
|
||||
|
||||
clk = _register_gate(NULL, node->name, parent_name, flags, ®,
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = _register_gate(node, name, parent_name, flags, ®,
|
||||
enable_bit, clk_gate_flags, ops, hw_ops);
|
||||
|
||||
if (!IS_ERR(clk))
|
||||
|
||||
@@ -32,7 +32,8 @@ static const struct clk_ops ti_interface_clk_ops = {
|
||||
.is_enabled = &omap2_dflt_clk_is_enabled,
|
||||
};
|
||||
|
||||
static struct clk *_register_interface(struct device *dev, const char *name,
|
||||
static struct clk *_register_interface(struct device_node *node,
|
||||
const char *name,
|
||||
const char *parent_name,
|
||||
struct clk_omap_reg *reg, u8 bit_idx,
|
||||
const struct clk_hw_omap_ops *ops)
|
||||
@@ -57,7 +58,7 @@ static struct clk *_register_interface(struct device *dev, const char *name,
|
||||
init.num_parents = 1;
|
||||
init.parent_names = &parent_name;
|
||||
|
||||
clk = ti_clk_register_omap_hw(NULL, &clk_hw->hw, name);
|
||||
clk = of_ti_clk_register_omap_hw(node, &clk_hw->hw, name);
|
||||
|
||||
if (IS_ERR(clk))
|
||||
kfree(clk_hw);
|
||||
@@ -72,6 +73,7 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node,
|
||||
const char *parent_name;
|
||||
struct clk_omap_reg reg;
|
||||
u8 enable_bit = 0;
|
||||
const char *name;
|
||||
u32 val;
|
||||
|
||||
if (ti_clk_get_reg_addr(node, 0, ®))
|
||||
@@ -86,7 +88,8 @@ static void __init _of_ti_interface_clk_setup(struct device_node *node,
|
||||
return;
|
||||
}
|
||||
|
||||
clk = _register_interface(NULL, node->name, parent_name, ®,
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = _register_interface(node, name, parent_name, ®,
|
||||
enable_bit, ops);
|
||||
|
||||
if (!IS_ERR(clk))
|
||||
|
||||
@@ -126,7 +126,7 @@ const struct clk_ops ti_clk_mux_ops = {
|
||||
.restore_context = clk_mux_restore_context,
|
||||
};
|
||||
|
||||
static struct clk *_register_mux(struct device *dev, const char *name,
|
||||
static struct clk *_register_mux(struct device_node *node, const char *name,
|
||||
const char * const *parent_names,
|
||||
u8 num_parents, unsigned long flags,
|
||||
struct clk_omap_reg *reg, u8 shift, u32 mask,
|
||||
@@ -156,7 +156,7 @@ static struct clk *_register_mux(struct device *dev, const char *name,
|
||||
mux->table = table;
|
||||
mux->hw.init = &init;
|
||||
|
||||
clk = ti_clk_register(dev, &mux->hw, name);
|
||||
clk = of_ti_clk_register(node, &mux->hw, name);
|
||||
|
||||
if (IS_ERR(clk))
|
||||
kfree(mux);
|
||||
@@ -176,6 +176,7 @@ static void of_mux_clk_setup(struct device_node *node)
|
||||
struct clk_omap_reg reg;
|
||||
unsigned int num_parents;
|
||||
const char **parent_names;
|
||||
const char *name;
|
||||
u8 clk_mux_flags = 0;
|
||||
u32 mask = 0;
|
||||
u32 shift = 0;
|
||||
@@ -213,7 +214,8 @@ static void of_mux_clk_setup(struct device_node *node)
|
||||
|
||||
mask = (1 << fls(mask)) - 1;
|
||||
|
||||
clk = _register_mux(NULL, node->name, parent_names, num_parents,
|
||||
name = ti_dt_clk_name(node);
|
||||
clk = _register_mux(node, name, parent_names, num_parents,
|
||||
flags, ®, shift, mask, latch, clk_mux_flags,
|
||||
NULL);
|
||||
|
||||
|
||||
@@ -566,7 +566,8 @@ static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,
|
||||
if (keylen != CHACHA_KEY_SIZE + saltlen)
|
||||
return -EINVAL;
|
||||
|
||||
ctx->cdata.key_virt = key;
|
||||
memcpy(ctx->key, key, keylen);
|
||||
ctx->cdata.key_virt = ctx->key;
|
||||
ctx->cdata.keylen = keylen - saltlen;
|
||||
|
||||
return chachapoly_set_sh_desc(aead);
|
||||
|
||||
@@ -639,7 +639,8 @@ static int chachapoly_setkey(struct crypto_aead *aead, const u8 *key,
|
||||
if (keylen != CHACHA_KEY_SIZE + saltlen)
|
||||
return -EINVAL;
|
||||
|
||||
ctx->cdata.key_virt = key;
|
||||
memcpy(ctx->key, key, keylen);
|
||||
ctx->cdata.key_virt = ctx->key;
|
||||
ctx->cdata.keylen = keylen - saltlen;
|
||||
|
||||
return chachapoly_set_sh_desc(aead);
|
||||
|
||||
@@ -854,7 +854,7 @@ static int hpre_cluster_debugfs_init(struct hisi_qm *qm)
|
||||
|
||||
for (i = 0; i < clusters_num; i++) {
|
||||
ret = snprintf(buf, HPRE_DBGFS_VAL_MAX_LEN, "cluster%d", i);
|
||||
if (ret < 0)
|
||||
if (ret >= HPRE_DBGFS_VAL_MAX_LEN)
|
||||
return -EINVAL;
|
||||
tmp_d = debugfs_create_dir(buf, qm->debug.debug_root);
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
#define ADF_PCI_MAX_BARS 3
|
||||
#define ADF_DEVICE_NAME_LENGTH 32
|
||||
#define ADF_ETR_MAX_RINGS_PER_BANK 16
|
||||
#define ADF_MAX_MSIX_VECTOR_NAME 16
|
||||
#define ADF_MAX_MSIX_VECTOR_NAME 48
|
||||
#define ADF_DEVICE_NAME_PREFIX "qat_"
|
||||
|
||||
enum adf_accel_capabilities {
|
||||
|
||||
@@ -90,7 +90,7 @@ DEFINE_SEQ_ATTRIBUTE(adf_ring_debug);
|
||||
int adf_ring_debugfs_add(struct adf_etr_ring_data *ring, const char *name)
|
||||
{
|
||||
struct adf_etr_ring_debug_entry *ring_debug;
|
||||
char entry_name[8];
|
||||
char entry_name[16];
|
||||
|
||||
ring_debug = kzalloc(sizeof(*ring_debug), GFP_KERNEL);
|
||||
if (!ring_debug)
|
||||
@@ -192,7 +192,7 @@ int adf_bank_debugfs_add(struct adf_etr_bank_data *bank)
|
||||
{
|
||||
struct adf_accel_dev *accel_dev = bank->accel_dev;
|
||||
struct dentry *parent = accel_dev->transport->debug;
|
||||
char name[8];
|
||||
char name[16];
|
||||
|
||||
snprintf(name, sizeof(name), "bank_%02d", bank->bank_number);
|
||||
bank->bank_debug_dir = debugfs_create_dir(name, parent);
|
||||
|
||||
@@ -39,40 +39,44 @@ void qat_alg_send_backlog(struct qat_instance_backlog *backlog)
|
||||
spin_unlock_bh(&backlog->lock);
|
||||
}
|
||||
|
||||
static void qat_alg_backlog_req(struct qat_alg_req *req,
|
||||
struct qat_instance_backlog *backlog)
|
||||
{
|
||||
INIT_LIST_HEAD(&req->list);
|
||||
|
||||
spin_lock_bh(&backlog->lock);
|
||||
list_add_tail(&req->list, &backlog->list);
|
||||
spin_unlock_bh(&backlog->lock);
|
||||
}
|
||||
|
||||
static int qat_alg_send_message_maybacklog(struct qat_alg_req *req)
|
||||
static bool qat_alg_try_enqueue(struct qat_alg_req *req)
|
||||
{
|
||||
struct qat_instance_backlog *backlog = req->backlog;
|
||||
struct adf_etr_ring_data *tx_ring = req->tx_ring;
|
||||
u32 *fw_req = req->fw_req;
|
||||
|
||||
/* If any request is already backlogged, then add to backlog list */
|
||||
/* Check if any request is already backlogged */
|
||||
if (!list_empty(&backlog->list))
|
||||
goto enqueue;
|
||||
return false;
|
||||
|
||||
/* If ring is nearly full, then add to backlog list */
|
||||
/* Check if ring is nearly full */
|
||||
if (adf_ring_nearly_full(tx_ring))
|
||||
goto enqueue;
|
||||
return false;
|
||||
|
||||
/* If adding request to HW ring fails, then add to backlog list */
|
||||
/* Try to enqueue to HW ring */
|
||||
if (adf_send_message(tx_ring, fw_req))
|
||||
goto enqueue;
|
||||
return false;
|
||||
|
||||
return -EINPROGRESS;
|
||||
return true;
|
||||
}
|
||||
|
||||
enqueue:
|
||||
qat_alg_backlog_req(req, backlog);
|
||||
|
||||
return -EBUSY;
|
||||
static int qat_alg_send_message_maybacklog(struct qat_alg_req *req)
|
||||
{
|
||||
struct qat_instance_backlog *backlog = req->backlog;
|
||||
int ret = -EINPROGRESS;
|
||||
|
||||
if (qat_alg_try_enqueue(req))
|
||||
return ret;
|
||||
|
||||
spin_lock_bh(&backlog->lock);
|
||||
if (!qat_alg_try_enqueue(req)) {
|
||||
list_add_tail(&req->list, &backlog->list);
|
||||
ret = -EBUSY;
|
||||
}
|
||||
spin_unlock_bh(&backlog->lock);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int qat_alg_send_message(struct qat_alg_req *req)
|
||||
|
||||
@@ -139,10 +139,9 @@ static void cxl_memdev_unregister(void *_cxlmd)
|
||||
struct cdev *cdev = &cxlmd->cdev;
|
||||
const struct cdevm_file_operations *cdevm_fops;
|
||||
|
||||
cdev_device_del(&cxlmd->cdev, dev);
|
||||
cdevm_fops = container_of(cdev->ops, typeof(*cdevm_fops), fops);
|
||||
cdevm_fops->shutdown(dev);
|
||||
|
||||
cdev_device_del(&cxlmd->cdev, dev);
|
||||
put_device(dev);
|
||||
}
|
||||
|
||||
|
||||
@@ -194,14 +194,15 @@ static int rockchip_dfi_probe(struct platform_device *pdev)
|
||||
return PTR_ERR(data->clk);
|
||||
}
|
||||
|
||||
/* try to find the optional reference to the pmu syscon */
|
||||
node = of_parse_phandle(np, "rockchip,pmu", 0);
|
||||
if (node) {
|
||||
data->regmap_pmu = syscon_node_to_regmap(node);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(data->regmap_pmu))
|
||||
return PTR_ERR(data->regmap_pmu);
|
||||
}
|
||||
if (!node)
|
||||
return dev_err_probe(&pdev->dev, -ENODEV, "Can't find pmu_grf registers\n");
|
||||
|
||||
data->regmap_pmu = syscon_node_to_regmap(node);
|
||||
of_node_put(node);
|
||||
if (IS_ERR(data->regmap_pmu))
|
||||
return PTR_ERR(data->regmap_pmu);
|
||||
|
||||
data->dev = dev;
|
||||
|
||||
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
ccflags-y += -DDEFAULT_SYMBOL_NAMESPACE=IDXD
|
||||
|
||||
obj-$(CONFIG_INTEL_IDXD_BUS) += idxd_bus.o
|
||||
idxd_bus-y := bus.o
|
||||
|
||||
obj-$(CONFIG_INTEL_IDXD) += idxd.o
|
||||
idxd-y := init.o irq.o device.o sysfs.o submit.o dma.o cdev.o
|
||||
|
||||
idxd-$(CONFIG_INTEL_IDXD_PERFMON) += perfmon.o
|
||||
|
||||
obj-$(CONFIG_INTEL_IDXD_BUS) += idxd_bus.o
|
||||
idxd_bus-y := bus.o
|
||||
|
||||
obj-$(CONFIG_INTEL_IDXD_COMPAT) += idxd_compat.o
|
||||
idxd_compat-y := compat.o
|
||||
|
||||
@@ -722,7 +722,6 @@ static void pxad_free_desc(struct virt_dma_desc *vd)
|
||||
dma_addr_t dma;
|
||||
struct pxad_desc_sw *sw_desc = to_pxad_sw_desc(vd);
|
||||
|
||||
BUG_ON(sw_desc->nb_desc == 0);
|
||||
for (i = sw_desc->nb_desc - 1; i >= 0; i--) {
|
||||
if (i > 0)
|
||||
dma = sw_desc->hw_desc[i - 1]->ddadr;
|
||||
|
||||
@@ -2459,7 +2459,7 @@ static int edma_probe(struct platform_device *pdev)
|
||||
if (irq < 0 && node)
|
||||
irq = irq_of_parse_and_map(node, 0);
|
||||
|
||||
if (irq >= 0) {
|
||||
if (irq > 0) {
|
||||
irq_name = devm_kasprintf(dev, GFP_KERNEL, "%s_ccint",
|
||||
dev_name(dev));
|
||||
ret = devm_request_irq(dev, irq, dma_irq_handler, 0, irq_name,
|
||||
@@ -2475,7 +2475,7 @@ static int edma_probe(struct platform_device *pdev)
|
||||
if (irq < 0 && node)
|
||||
irq = irq_of_parse_and_map(node, 2);
|
||||
|
||||
if (irq >= 0) {
|
||||
if (irq > 0) {
|
||||
irq_name = devm_kasprintf(dev, GFP_KERNEL, "%s_ccerrint",
|
||||
dev_name(dev));
|
||||
ret = devm_request_irq(dev, irq, dma_ccerr_handler, 0, irq_name,
|
||||
|
||||
@@ -192,6 +192,7 @@ struct ffa_device *ffa_device_register(const uuid_t *uuid, int vm_id)
|
||||
dev->release = ffa_release_device;
|
||||
dev_set_name(&ffa_dev->dev, "arm-ffa-%d", id);
|
||||
|
||||
ffa_dev->id = id;
|
||||
ffa_dev->vm_id = vm_id;
|
||||
uuid_copy(&ffa_dev->uuid, uuid);
|
||||
|
||||
|
||||
@@ -190,19 +190,6 @@ static int ti_sci_debugfs_create(struct platform_device *pdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_sci_debugfs_destroy() - clean up log debug file
|
||||
* @pdev: platform device pointer
|
||||
* @info: Pointer to SCI entity information
|
||||
*/
|
||||
static void ti_sci_debugfs_destroy(struct platform_device *pdev,
|
||||
struct ti_sci_info *info)
|
||||
{
|
||||
if (IS_ERR(info->debug_region))
|
||||
return;
|
||||
|
||||
debugfs_remove(info->d);
|
||||
}
|
||||
#else /* CONFIG_DEBUG_FS */
|
||||
static inline int ti_sci_debugfs_create(struct platform_device *dev,
|
||||
struct ti_sci_info *info)
|
||||
@@ -3435,43 +3422,12 @@ out:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int ti_sci_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct ti_sci_info *info;
|
||||
struct device *dev = &pdev->dev;
|
||||
int ret = 0;
|
||||
|
||||
of_platform_depopulate(dev);
|
||||
|
||||
info = platform_get_drvdata(pdev);
|
||||
|
||||
if (info->nb.notifier_call)
|
||||
unregister_restart_handler(&info->nb);
|
||||
|
||||
mutex_lock(&ti_sci_list_mutex);
|
||||
if (info->users)
|
||||
ret = -EBUSY;
|
||||
else
|
||||
list_del(&info->node);
|
||||
mutex_unlock(&ti_sci_list_mutex);
|
||||
|
||||
if (!ret) {
|
||||
ti_sci_debugfs_destroy(pdev, info);
|
||||
|
||||
/* Safe to free channels since no more users */
|
||||
mbox_free_channel(info->chan_tx);
|
||||
mbox_free_channel(info->chan_rx);
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static struct platform_driver ti_sci_driver = {
|
||||
.probe = ti_sci_probe,
|
||||
.remove = ti_sci_remove,
|
||||
.driver = {
|
||||
.name = "ti-sci",
|
||||
.of_match_table = of_match_ptr(ti_sci_of_match),
|
||||
.suppress_bind_attrs = true,
|
||||
},
|
||||
};
|
||||
module_platform_driver(ti_sci_driver);
|
||||
|
||||
@@ -433,11 +433,11 @@ svm_range_validate_svm_bo(struct amdgpu_device *adev, struct svm_range *prange)
|
||||
|
||||
/* We need a new svm_bo. Spin-loop to wait for concurrent
|
||||
* svm_range_bo_release to finish removing this range from
|
||||
* its range list. After this, it is safe to reuse the
|
||||
* svm_bo pointer and svm_bo_list head.
|
||||
* its range list and set prange->svm_bo to null. After this,
|
||||
* it is safe to reuse the svm_bo pointer and svm_bo_list head.
|
||||
*/
|
||||
while (!list_empty_careful(&prange->svm_bo_list))
|
||||
;
|
||||
while (!list_empty_careful(&prange->svm_bo_list) || prange->svm_bo)
|
||||
cond_resched();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -43,7 +43,6 @@ struct lt8912 {
|
||||
|
||||
u8 data_lanes;
|
||||
bool is_power_on;
|
||||
bool is_attached;
|
||||
};
|
||||
|
||||
static int lt8912_write_init_config(struct lt8912 *lt)
|
||||
@@ -481,11 +480,11 @@ static int lt8912_attach_dsi(struct lt8912 *lt)
|
||||
return -EPROBE_DEFER;
|
||||
}
|
||||
|
||||
dsi = mipi_dsi_device_register_full(host, &info);
|
||||
dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
|
||||
if (IS_ERR(dsi)) {
|
||||
ret = PTR_ERR(dsi);
|
||||
dev_err(dev, "failed to create dsi device (%d)\n", ret);
|
||||
goto err_dsi_device;
|
||||
return ret;
|
||||
}
|
||||
|
||||
lt->dsi = dsi;
|
||||
@@ -497,24 +496,21 @@ static int lt8912_attach_dsi(struct lt8912 *lt)
|
||||
MIPI_DSI_MODE_LPM |
|
||||
MIPI_DSI_MODE_NO_EOT_PACKET;
|
||||
|
||||
ret = mipi_dsi_attach(dsi);
|
||||
ret = devm_mipi_dsi_attach(dev, dsi);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "failed to attach dsi to host\n");
|
||||
goto err_dsi_attach;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_dsi_attach:
|
||||
mipi_dsi_device_unregister(dsi);
|
||||
err_dsi_device:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void lt8912_detach_dsi(struct lt8912 *lt)
|
||||
static void lt8912_bridge_hpd_cb(void *data, enum drm_connector_status status)
|
||||
{
|
||||
mipi_dsi_detach(lt->dsi);
|
||||
mipi_dsi_device_unregister(lt->dsi);
|
||||
struct lt8912 *lt = data;
|
||||
|
||||
if (lt->bridge.dev)
|
||||
drm_helper_hpd_irq_event(lt->bridge.dev);
|
||||
}
|
||||
|
||||
static int lt8912_bridge_connector_init(struct drm_bridge *bridge)
|
||||
@@ -523,8 +519,13 @@ static int lt8912_bridge_connector_init(struct drm_bridge *bridge)
|
||||
struct lt8912 *lt = bridge_to_lt8912(bridge);
|
||||
struct drm_connector *connector = <->connector;
|
||||
|
||||
connector->polled = DRM_CONNECTOR_POLL_CONNECT |
|
||||
DRM_CONNECTOR_POLL_DISCONNECT;
|
||||
if (lt->hdmi_port->ops & DRM_BRIDGE_OP_HPD) {
|
||||
drm_bridge_hpd_enable(lt->hdmi_port, lt8912_bridge_hpd_cb, lt);
|
||||
connector->polled = DRM_CONNECTOR_POLL_HPD;
|
||||
} else {
|
||||
connector->polled = DRM_CONNECTOR_POLL_CONNECT |
|
||||
DRM_CONNECTOR_POLL_DISCONNECT;
|
||||
}
|
||||
|
||||
ret = drm_connector_init(bridge->dev, connector,
|
||||
<8912_connector_funcs,
|
||||
@@ -547,6 +548,13 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,
|
||||
struct lt8912 *lt = bridge_to_lt8912(bridge);
|
||||
int ret;
|
||||
|
||||
ret = drm_bridge_attach(bridge->encoder, lt->hdmi_port, bridge,
|
||||
DRM_BRIDGE_ATTACH_NO_CONNECTOR);
|
||||
if (ret < 0) {
|
||||
dev_err(lt->dev, "Failed to attach next bridge (%d)\n", ret);
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (!(flags & DRM_BRIDGE_ATTACH_NO_CONNECTOR)) {
|
||||
ret = lt8912_bridge_connector_init(bridge);
|
||||
if (ret) {
|
||||
@@ -563,12 +571,6 @@ static int lt8912_bridge_attach(struct drm_bridge *bridge,
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
ret = lt8912_attach_dsi(lt);
|
||||
if (ret)
|
||||
goto error;
|
||||
|
||||
lt->is_attached = true;
|
||||
|
||||
return 0;
|
||||
|
||||
error:
|
||||
@@ -580,12 +582,10 @@ static void lt8912_bridge_detach(struct drm_bridge *bridge)
|
||||
{
|
||||
struct lt8912 *lt = bridge_to_lt8912(bridge);
|
||||
|
||||
if (lt->is_attached) {
|
||||
lt8912_detach_dsi(lt);
|
||||
lt8912_hard_power_off(lt);
|
||||
drm_connector_unregister(<->connector);
|
||||
drm_connector_cleanup(<->connector);
|
||||
}
|
||||
lt8912_hard_power_off(lt);
|
||||
|
||||
if (lt->connector.dev && lt->hdmi_port->ops & DRM_BRIDGE_OP_HPD)
|
||||
drm_bridge_hpd_disable(lt->hdmi_port);
|
||||
}
|
||||
|
||||
static enum drm_connector_status
|
||||
@@ -726,8 +726,15 @@ static int lt8912_probe(struct i2c_client *client,
|
||||
|
||||
drm_bridge_add(<->bridge);
|
||||
|
||||
ret = lt8912_attach_dsi(lt);
|
||||
if (ret)
|
||||
goto err_attach;
|
||||
|
||||
return 0;
|
||||
|
||||
err_attach:
|
||||
drm_bridge_remove(<->bridge);
|
||||
lt8912_free_i2c(lt);
|
||||
err_i2c:
|
||||
lt8912_put_dt(lt);
|
||||
err_dt_parse:
|
||||
@@ -738,7 +745,6 @@ static int lt8912_remove(struct i2c_client *client)
|
||||
{
|
||||
struct lt8912 *lt = i2c_get_clientdata(client);
|
||||
|
||||
lt8912_bridge_detach(<->bridge);
|
||||
drm_bridge_remove(<->bridge);
|
||||
lt8912_free_i2c(lt);
|
||||
lt8912_put_dt(lt);
|
||||
|
||||
@@ -258,17 +258,18 @@ static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc,
|
||||
const struct mipi_dsi_device_info info = { "lt9611uxc", 0, NULL };
|
||||
struct mipi_dsi_device *dsi;
|
||||
struct mipi_dsi_host *host;
|
||||
struct device *dev = lt9611uxc->dev;
|
||||
int ret;
|
||||
|
||||
host = of_find_mipi_dsi_host_by_node(dsi_node);
|
||||
if (!host) {
|
||||
dev_err(lt9611uxc->dev, "failed to find dsi host\n");
|
||||
dev_err(dev, "failed to find dsi host\n");
|
||||
return ERR_PTR(-EPROBE_DEFER);
|
||||
}
|
||||
|
||||
dsi = mipi_dsi_device_register_full(host, &info);
|
||||
dsi = devm_mipi_dsi_device_register_full(dev, host, &info);
|
||||
if (IS_ERR(dsi)) {
|
||||
dev_err(lt9611uxc->dev, "failed to create dsi device\n");
|
||||
dev_err(dev, "failed to create dsi device\n");
|
||||
return dsi;
|
||||
}
|
||||
|
||||
@@ -277,10 +278,9 @@ static struct mipi_dsi_device *lt9611uxc_attach_dsi(struct lt9611uxc *lt9611uxc,
|
||||
dsi->mode_flags = MIPI_DSI_MODE_VIDEO | MIPI_DSI_MODE_VIDEO_SYNC_PULSE |
|
||||
MIPI_DSI_MODE_VIDEO_HSE;
|
||||
|
||||
ret = mipi_dsi_attach(dsi);
|
||||
ret = devm_mipi_dsi_attach(dev, dsi);
|
||||
if (ret < 0) {
|
||||
dev_err(lt9611uxc->dev, "failed to attach dsi to host\n");
|
||||
mipi_dsi_device_unregister(dsi);
|
||||
dev_err(dev, "failed to attach dsi to host\n");
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
@@ -355,19 +355,6 @@ static int lt9611uxc_connector_init(struct drm_bridge *bridge, struct lt9611uxc
|
||||
return drm_connector_attach_encoder(<9611uxc->connector, bridge->encoder);
|
||||
}
|
||||
|
||||
static void lt9611uxc_bridge_detach(struct drm_bridge *bridge)
|
||||
{
|
||||
struct lt9611uxc *lt9611uxc = bridge_to_lt9611uxc(bridge);
|
||||
|
||||
if (lt9611uxc->dsi1) {
|
||||
mipi_dsi_detach(lt9611uxc->dsi1);
|
||||
mipi_dsi_device_unregister(lt9611uxc->dsi1);
|
||||
}
|
||||
|
||||
mipi_dsi_detach(lt9611uxc->dsi0);
|
||||
mipi_dsi_device_unregister(lt9611uxc->dsi0);
|
||||
}
|
||||
|
||||
static int lt9611uxc_bridge_attach(struct drm_bridge *bridge,
|
||||
enum drm_bridge_attach_flags flags)
|
||||
{
|
||||
@@ -380,27 +367,7 @@ static int lt9611uxc_bridge_attach(struct drm_bridge *bridge,
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Attach primary DSI */
|
||||
lt9611uxc->dsi0 = lt9611uxc_attach_dsi(lt9611uxc, lt9611uxc->dsi0_node);
|
||||
if (IS_ERR(lt9611uxc->dsi0))
|
||||
return PTR_ERR(lt9611uxc->dsi0);
|
||||
|
||||
/* Attach secondary DSI, if specified */
|
||||
if (lt9611uxc->dsi1_node) {
|
||||
lt9611uxc->dsi1 = lt9611uxc_attach_dsi(lt9611uxc, lt9611uxc->dsi1_node);
|
||||
if (IS_ERR(lt9611uxc->dsi1)) {
|
||||
ret = PTR_ERR(lt9611uxc->dsi1);
|
||||
goto err_unregister_dsi0;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_unregister_dsi0:
|
||||
mipi_dsi_detach(lt9611uxc->dsi0);
|
||||
mipi_dsi_device_unregister(lt9611uxc->dsi0);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static enum drm_mode_status
|
||||
@@ -544,7 +511,6 @@ static struct edid *lt9611uxc_bridge_get_edid(struct drm_bridge *bridge,
|
||||
|
||||
static const struct drm_bridge_funcs lt9611uxc_bridge_funcs = {
|
||||
.attach = lt9611uxc_bridge_attach,
|
||||
.detach = lt9611uxc_bridge_detach,
|
||||
.mode_valid = lt9611uxc_bridge_mode_valid,
|
||||
.mode_set = lt9611uxc_bridge_mode_set,
|
||||
.detect = lt9611uxc_bridge_detect,
|
||||
@@ -961,9 +927,9 @@ retry:
|
||||
init_waitqueue_head(<9611uxc->wq);
|
||||
INIT_WORK(<9611uxc->work, lt9611uxc_hpd_work);
|
||||
|
||||
ret = devm_request_threaded_irq(dev, client->irq, NULL,
|
||||
lt9611uxc_irq_thread_handler,
|
||||
IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
|
||||
ret = request_threaded_irq(client->irq, NULL,
|
||||
lt9611uxc_irq_thread_handler,
|
||||
IRQF_ONESHOT, "lt9611uxc", lt9611uxc);
|
||||
if (ret) {
|
||||
dev_err(dev, "failed to request irq\n");
|
||||
goto err_disable_regulators;
|
||||
@@ -980,8 +946,29 @@ retry:
|
||||
|
||||
drm_bridge_add(<9611uxc->bridge);
|
||||
|
||||
/* Attach primary DSI */
|
||||
lt9611uxc->dsi0 = lt9611uxc_attach_dsi(lt9611uxc, lt9611uxc->dsi0_node);
|
||||
if (IS_ERR(lt9611uxc->dsi0)) {
|
||||
ret = PTR_ERR(lt9611uxc->dsi0);
|
||||
goto err_remove_bridge;
|
||||
}
|
||||
|
||||
/* Attach secondary DSI, if specified */
|
||||
if (lt9611uxc->dsi1_node) {
|
||||
lt9611uxc->dsi1 = lt9611uxc_attach_dsi(lt9611uxc, lt9611uxc->dsi1_node);
|
||||
if (IS_ERR(lt9611uxc->dsi1)) {
|
||||
ret = PTR_ERR(lt9611uxc->dsi1);
|
||||
goto err_remove_bridge;
|
||||
}
|
||||
}
|
||||
|
||||
return lt9611uxc_audio_init(dev, lt9611uxc);
|
||||
|
||||
err_remove_bridge:
|
||||
free_irq(client->irq, lt9611uxc);
|
||||
cancel_work_sync(<9611uxc->work);
|
||||
drm_bridge_remove(<9611uxc->bridge);
|
||||
|
||||
err_disable_regulators:
|
||||
regulator_bulk_disable(ARRAY_SIZE(lt9611uxc->supplies), lt9611uxc->supplies);
|
||||
|
||||
@@ -996,7 +983,7 @@ static int lt9611uxc_remove(struct i2c_client *client)
|
||||
{
|
||||
struct lt9611uxc *lt9611uxc = i2c_get_clientdata(client);
|
||||
|
||||
disable_irq(client->irq);
|
||||
free_irq(client->irq, lt9611uxc);
|
||||
cancel_work_sync(<9611uxc->work);
|
||||
lt9611uxc_audio_exit(lt9611uxc);
|
||||
drm_bridge_remove(<9611uxc->bridge);
|
||||
|
||||
@@ -217,6 +217,10 @@ static void tc358768_update_bits(struct tc358768_priv *priv, u32 reg, u32 mask,
|
||||
u32 tmp, orig;
|
||||
|
||||
tc358768_read(priv, reg, &orig);
|
||||
|
||||
if (priv->error)
|
||||
return;
|
||||
|
||||
tmp = orig & ~mask;
|
||||
tmp |= val & mask;
|
||||
if (tmp != orig)
|
||||
@@ -633,6 +637,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)
|
||||
{
|
||||
struct tc358768_priv *priv = bridge_to_tc358768(bridge);
|
||||
struct mipi_dsi_device *dsi_dev = priv->output.dev;
|
||||
unsigned long mode_flags = dsi_dev->mode_flags;
|
||||
u32 val, val2, lptxcnt, hact, data_type;
|
||||
s32 raw_val;
|
||||
const struct drm_display_mode *mode;
|
||||
@@ -640,6 +645,11 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)
|
||||
u32 dsiclk, dsibclk;
|
||||
int ret, i;
|
||||
|
||||
if (mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) {
|
||||
dev_warn_once(priv->dev, "Non-continuous mode unimplemented, falling back to continuous\n");
|
||||
mode_flags &= ~MIPI_DSI_CLOCK_NON_CONTINUOUS;
|
||||
}
|
||||
|
||||
tc358768_hw_enable(priv);
|
||||
|
||||
ret = tc358768_sw_reset(priv);
|
||||
@@ -775,8 +785,8 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)
|
||||
val |= BIT(i + 1);
|
||||
tc358768_write(priv, TC358768_HSTXVREGEN, val);
|
||||
|
||||
if (!(dsi_dev->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS))
|
||||
tc358768_write(priv, TC358768_TXOPTIONCNTRL, 0x1);
|
||||
tc358768_write(priv, TC358768_TXOPTIONCNTRL,
|
||||
(mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS) ? 0 : BIT(0));
|
||||
|
||||
/* TXTAGOCNT[26:16] RXTASURECNT[10:0] */
|
||||
val = tc358768_to_ns((lptxcnt + 1) * dsibclk_nsk * 4);
|
||||
@@ -812,11 +822,12 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)
|
||||
tc358768_write(priv, TC358768_DSI_HACT, hact);
|
||||
|
||||
/* VSYNC polarity */
|
||||
if (!(mode->flags & DRM_MODE_FLAG_NVSYNC))
|
||||
tc358768_update_bits(priv, TC358768_CONFCTL, BIT(5), BIT(5));
|
||||
tc358768_update_bits(priv, TC358768_CONFCTL, BIT(5),
|
||||
(mode->flags & DRM_MODE_FLAG_PVSYNC) ? BIT(5) : 0);
|
||||
|
||||
/* HSYNC polarity */
|
||||
if (mode->flags & DRM_MODE_FLAG_PHSYNC)
|
||||
tc358768_update_bits(priv, TC358768_PP_MISC, BIT(0), BIT(0));
|
||||
tc358768_update_bits(priv, TC358768_PP_MISC, BIT(0),
|
||||
(mode->flags & DRM_MODE_FLAG_PHSYNC) ? BIT(0) : 0);
|
||||
|
||||
/* Start DSI Tx */
|
||||
tc358768_write(priv, TC358768_DSI_START, 0x1);
|
||||
@@ -832,7 +843,7 @@ static void tc358768_bridge_pre_enable(struct drm_bridge *bridge)
|
||||
|
||||
val |= TC358768_DSI_CONTROL_TXMD;
|
||||
|
||||
if (!(dsi_dev->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS))
|
||||
if (!(mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS))
|
||||
val |= TC358768_DSI_CONTROL_HSCKMD;
|
||||
|
||||
if (dsi_dev->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)
|
||||
|
||||
@@ -246,6 +246,52 @@ void mipi_dsi_device_unregister(struct mipi_dsi_device *dsi)
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_device_unregister);
|
||||
|
||||
static void devm_mipi_dsi_device_unregister(void *arg)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = arg;
|
||||
|
||||
mipi_dsi_device_unregister(dsi);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_mipi_dsi_device_register_full - create a managed MIPI DSI device
|
||||
* @dev: device to tie the MIPI-DSI device lifetime to
|
||||
* @host: DSI host to which this device is connected
|
||||
* @info: pointer to template containing DSI device information
|
||||
*
|
||||
* Create a MIPI DSI device by using the device information provided by
|
||||
* mipi_dsi_device_info template
|
||||
*
|
||||
* This is the managed version of mipi_dsi_device_register_full() which
|
||||
* automatically calls mipi_dsi_device_unregister() when @dev is
|
||||
* unbound.
|
||||
*
|
||||
* Returns:
|
||||
* A pointer to the newly created MIPI DSI device, or, a pointer encoded
|
||||
* with an error
|
||||
*/
|
||||
struct mipi_dsi_device *
|
||||
devm_mipi_dsi_device_register_full(struct device *dev,
|
||||
struct mipi_dsi_host *host,
|
||||
const struct mipi_dsi_device_info *info)
|
||||
{
|
||||
struct mipi_dsi_device *dsi;
|
||||
int ret;
|
||||
|
||||
dsi = mipi_dsi_device_register_full(host, info);
|
||||
if (IS_ERR(dsi))
|
||||
return dsi;
|
||||
|
||||
ret = devm_add_action_or_reset(dev,
|
||||
devm_mipi_dsi_device_unregister,
|
||||
dsi);
|
||||
if (ret)
|
||||
return ERR_PTR(ret);
|
||||
|
||||
return dsi;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_mipi_dsi_device_register_full);
|
||||
|
||||
static DEFINE_MUTEX(host_lock);
|
||||
static LIST_HEAD(host_list);
|
||||
|
||||
@@ -346,6 +392,41 @@ int mipi_dsi_detach(struct mipi_dsi_device *dsi)
|
||||
}
|
||||
EXPORT_SYMBOL(mipi_dsi_detach);
|
||||
|
||||
static void devm_mipi_dsi_detach(void *arg)
|
||||
{
|
||||
struct mipi_dsi_device *dsi = arg;
|
||||
|
||||
mipi_dsi_detach(dsi);
|
||||
}
|
||||
|
||||
/**
|
||||
* devm_mipi_dsi_attach - Attach a MIPI-DSI device to its DSI Host
|
||||
* @dev: device to tie the MIPI-DSI device attachment lifetime to
|
||||
* @dsi: DSI peripheral
|
||||
*
|
||||
* This is the managed version of mipi_dsi_attach() which automatically
|
||||
* calls mipi_dsi_detach() when @dev is unbound.
|
||||
*
|
||||
* Returns:
|
||||
* 0 on success, a negative error code on failure.
|
||||
*/
|
||||
int devm_mipi_dsi_attach(struct device *dev,
|
||||
struct mipi_dsi_device *dsi)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = mipi_dsi_attach(dsi);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = devm_add_action_or_reset(dev, devm_mipi_dsi_detach, dsi);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(devm_mipi_dsi_attach);
|
||||
|
||||
static ssize_t mipi_dsi_device_transfer(struct mipi_dsi_device *dsi,
|
||||
struct mipi_dsi_msg *msg)
|
||||
{
|
||||
|
||||
@@ -1056,7 +1056,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
|
||||
fence = drm_syncobj_fence_get(syncobjs[i]);
|
||||
if (!fence || dma_fence_chain_find_seqno(&fence, points[i])) {
|
||||
dma_fence_put(fence);
|
||||
if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
|
||||
if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
|
||||
DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE)) {
|
||||
continue;
|
||||
} else {
|
||||
timeout = -EINVAL;
|
||||
|
||||
@@ -362,6 +362,9 @@ static int mtk_crtc_ddp_hw_init(struct mtk_drm_crtc *mtk_crtc)
|
||||
unsigned int local_layer;
|
||||
|
||||
plane_state = to_mtk_plane_state(plane->state);
|
||||
|
||||
/* should not enable layer before crtc enabled */
|
||||
plane_state->pending.enable = false;
|
||||
comp = mtk_drm_ddp_comp_for_plane(crtc, plane, &local_layer);
|
||||
if (comp)
|
||||
mtk_ddp_comp_layer_config(comp, local_layer,
|
||||
|
||||
@@ -154,9 +154,9 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane,
|
||||
plane->state->src_y = new_state->src_y;
|
||||
plane->state->src_h = new_state->src_h;
|
||||
plane->state->src_w = new_state->src_w;
|
||||
swap(plane->state->fb, new_state->fb);
|
||||
|
||||
mtk_plane_update_new_state(new_state, new_plane_state);
|
||||
swap(plane->state->fb, new_state->fb);
|
||||
wmb(); /* Make sure the above parameters are set before update */
|
||||
new_plane_state->pending.async_dirty = true;
|
||||
mtk_drm_crtc_async_update(new_state->crtc, plane, state);
|
||||
|
||||
@@ -406,7 +406,7 @@ static void mtk_dsi_rxtx_control(struct mtk_dsi *dsi)
|
||||
if (dsi->mode_flags & MIPI_DSI_CLOCK_NON_CONTINUOUS)
|
||||
tmp_reg |= HSTX_CKLP_EN;
|
||||
|
||||
if (!(dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET))
|
||||
if (dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET)
|
||||
tmp_reg |= DIS_EOT;
|
||||
|
||||
writel(tmp_reg, dsi->regs + DSI_TXRX_CTRL);
|
||||
@@ -483,7 +483,7 @@ static void mtk_dsi_config_vdo_timing(struct mtk_dsi *dsi)
|
||||
timing->da_hs_zero + timing->da_hs_exit + 3;
|
||||
|
||||
delta = dsi->mode_flags & MIPI_DSI_MODE_VIDEO_BURST ? 18 : 12;
|
||||
delta += dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET ? 2 : 0;
|
||||
delta += dsi->mode_flags & MIPI_DSI_MODE_NO_EOT_PACKET ? 0 : 2;
|
||||
|
||||
horizontal_frontporch_byte = vm->hfront_porch * dsi_tmp_buf_bpp;
|
||||
horizontal_front_back_byte = horizontal_frontporch_byte + horizontal_backporch_byte;
|
||||
|
||||
@@ -1154,8 +1154,7 @@ static void dsi_tx_buf_free(struct msm_dsi_host *msm_host)
|
||||
|
||||
priv = dev->dev_private;
|
||||
if (msm_host->tx_gem_obj) {
|
||||
msm_gem_unpin_iova(msm_host->tx_gem_obj, priv->kms->aspace);
|
||||
drm_gem_object_put(msm_host->tx_gem_obj);
|
||||
msm_gem_kernel_put(msm_host->tx_gem_obj, priv->kms->aspace);
|
||||
msm_host->tx_gem_obj = NULL;
|
||||
}
|
||||
|
||||
|
||||
@@ -4820,14 +4820,15 @@ restart_ih:
|
||||
break;
|
||||
case 44: /* hdmi */
|
||||
afmt_idx = src_data;
|
||||
if (!(afmt_status[afmt_idx] & AFMT_AZ_FORMAT_WTRIG))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
if (afmt_idx > 5) {
|
||||
DRM_ERROR("Unhandled interrupt: %d %d\n",
|
||||
src_id, src_data);
|
||||
break;
|
||||
}
|
||||
|
||||
if (!(afmt_status[afmt_idx] & AFMT_AZ_FORMAT_WTRIG))
|
||||
DRM_DEBUG("IH: IH event w/o asserted irq bit?\n");
|
||||
|
||||
afmt_status[afmt_idx] &= ~AFMT_AZ_FORMAT_WTRIG;
|
||||
queue_hdmi = true;
|
||||
DRM_DEBUG("IH: HDMI%d\n", afmt_idx + 1);
|
||||
|
||||
@@ -1146,6 +1146,7 @@ static int cdn_dp_probe(struct platform_device *pdev)
|
||||
struct cdn_dp_device *dp;
|
||||
struct extcon_dev *extcon;
|
||||
struct phy *phy;
|
||||
int ret;
|
||||
int i;
|
||||
|
||||
dp = devm_kzalloc(dev, sizeof(*dp), GFP_KERNEL);
|
||||
@@ -1186,9 +1187,19 @@ static int cdn_dp_probe(struct platform_device *pdev)
|
||||
mutex_init(&dp->lock);
|
||||
dev_set_drvdata(dev, dp);
|
||||
|
||||
cdn_dp_audio_codec_init(dp, dev);
|
||||
ret = cdn_dp_audio_codec_init(dp, dev);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
return component_add(dev, &cdn_dp_component_ops);
|
||||
ret = component_add(dev, &cdn_dp_component_ops);
|
||||
if (ret)
|
||||
goto err_audio_deinit;
|
||||
|
||||
return 0;
|
||||
|
||||
err_audio_deinit:
|
||||
platform_device_unregister(dp->audio_pdev);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int cdn_dp_remove(struct platform_device *pdev)
|
||||
|
||||
@@ -39,7 +39,7 @@ static int rockchip_gem_iommu_map(struct rockchip_gem_object *rk_obj)
|
||||
|
||||
ret = iommu_map_sgtable(private->domain, rk_obj->dma_addr, rk_obj->sgt,
|
||||
prot);
|
||||
if (ret < rk_obj->base.size) {
|
||||
if (ret < (ssize_t)rk_obj->base.size) {
|
||||
DRM_ERROR("failed to map buffer: size=%zd request_size=%zd\n",
|
||||
ret, rk_obj->base.size);
|
||||
ret = -ENOMEM;
|
||||
|
||||
@@ -1554,7 +1554,8 @@ static struct drm_crtc_state *vop_crtc_duplicate_state(struct drm_crtc *crtc)
|
||||
if (WARN_ON(!crtc->state))
|
||||
return NULL;
|
||||
|
||||
rockchip_state = kzalloc(sizeof(*rockchip_state), GFP_KERNEL);
|
||||
rockchip_state = kmemdup(to_rockchip_crtc_state(crtc->state),
|
||||
sizeof(*rockchip_state), GFP_KERNEL);
|
||||
if (!rockchip_state)
|
||||
return NULL;
|
||||
|
||||
@@ -1579,7 +1580,10 @@ static void vop_crtc_reset(struct drm_crtc *crtc)
|
||||
if (crtc->state)
|
||||
vop_crtc_destroy_state(crtc, crtc->state);
|
||||
|
||||
__drm_atomic_helper_crtc_reset(crtc, &crtc_state->base);
|
||||
if (crtc_state)
|
||||
__drm_atomic_helper_crtc_reset(crtc, &crtc_state->base);
|
||||
else
|
||||
__drm_atomic_helper_crtc_reset(crtc, NULL);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_DRM_ANALOGIX_DP
|
||||
|
||||
@@ -1157,8 +1157,6 @@ static unsigned int cp2112_gpio_irq_startup(struct irq_data *d)
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct cp2112_device *dev = gpiochip_get_data(gc);
|
||||
|
||||
INIT_DELAYED_WORK(&dev->gpio_poll_worker, cp2112_gpio_poll_callback);
|
||||
|
||||
if (!dev->gpio_poll) {
|
||||
dev->gpio_poll = true;
|
||||
schedule_delayed_work(&dev->gpio_poll_worker, 0);
|
||||
@@ -1173,7 +1171,10 @@ static void cp2112_gpio_irq_shutdown(struct irq_data *d)
|
||||
struct gpio_chip *gc = irq_data_get_irq_chip_data(d);
|
||||
struct cp2112_device *dev = gpiochip_get_data(gc);
|
||||
|
||||
cancel_delayed_work_sync(&dev->gpio_poll_worker);
|
||||
if (!dev->irq_mask) {
|
||||
dev->gpio_poll = false;
|
||||
cancel_delayed_work_sync(&dev->gpio_poll_worker);
|
||||
}
|
||||
}
|
||||
|
||||
static int cp2112_gpio_irq_type(struct irq_data *d, unsigned int type)
|
||||
@@ -1354,6 +1355,8 @@ static int cp2112_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
girq->handler = handle_simple_irq;
|
||||
girq->threaded = true;
|
||||
|
||||
INIT_DELAYED_WORK(&dev->gpio_poll_worker, cp2112_gpio_poll_callback);
|
||||
|
||||
ret = gpiochip_add_data(&dev->gc, dev);
|
||||
if (ret < 0) {
|
||||
hid_err(hdev, "error registering gpio chip\n");
|
||||
|
||||
@@ -31,11 +31,6 @@ MODULE_LICENSE("GPL");
|
||||
MODULE_AUTHOR("Benjamin Tissoires <benjamin.tissoires@gmail.com>");
|
||||
MODULE_AUTHOR("Nestor Lopez Casado <nlopezcasad@logitech.com>");
|
||||
|
||||
static bool disable_raw_mode;
|
||||
module_param(disable_raw_mode, bool, 0644);
|
||||
MODULE_PARM_DESC(disable_raw_mode,
|
||||
"Disable Raw mode reporting for touchpads and keep firmware gestures.");
|
||||
|
||||
static bool disable_tap_to_click;
|
||||
module_param(disable_tap_to_click, bool, 0644);
|
||||
MODULE_PARM_DESC(disable_tap_to_click,
|
||||
@@ -68,7 +63,7 @@ MODULE_PARM_DESC(disable_tap_to_click,
|
||||
/* bits 2..20 are reserved for classes */
|
||||
/* #define HIDPP_QUIRK_CONNECT_EVENTS BIT(21) disabled */
|
||||
#define HIDPP_QUIRK_WTP_PHYSICAL_BUTTONS BIT(22)
|
||||
#define HIDPP_QUIRK_NO_HIDINPUT BIT(23)
|
||||
#define HIDPP_QUIRK_DELAYED_INIT BIT(23)
|
||||
#define HIDPP_QUIRK_FORCE_OUTPUT_REPORTS BIT(24)
|
||||
#define HIDPP_QUIRK_UNIFYING BIT(25)
|
||||
#define HIDPP_QUIRK_HI_RES_SCROLL_1P0 BIT(26)
|
||||
@@ -87,8 +82,6 @@ MODULE_PARM_DESC(disable_tap_to_click,
|
||||
HIDPP_QUIRK_HI_RES_SCROLL_X2120 | \
|
||||
HIDPP_QUIRK_HI_RES_SCROLL_X2121)
|
||||
|
||||
#define HIDPP_QUIRK_DELAYED_INIT HIDPP_QUIRK_NO_HIDINPUT
|
||||
|
||||
#define HIDPP_CAPABILITY_HIDPP10_BATTERY BIT(0)
|
||||
#define HIDPP_CAPABILITY_HIDPP20_BATTERY BIT(1)
|
||||
#define HIDPP_CAPABILITY_BATTERY_MILEAGE BIT(2)
|
||||
@@ -1760,15 +1753,14 @@ static int hidpp_battery_get_property(struct power_supply *psy,
|
||||
/* -------------------------------------------------------------------------- */
|
||||
#define HIDPP_PAGE_WIRELESS_DEVICE_STATUS 0x1d4b
|
||||
|
||||
static int hidpp_set_wireless_feature_index(struct hidpp_device *hidpp)
|
||||
static int hidpp_get_wireless_feature_index(struct hidpp_device *hidpp, u8 *feature_index)
|
||||
{
|
||||
u8 feature_type;
|
||||
int ret;
|
||||
|
||||
ret = hidpp_root_get_feature(hidpp,
|
||||
HIDPP_PAGE_WIRELESS_DEVICE_STATUS,
|
||||
&hidpp->wireless_feature_index,
|
||||
&feature_type);
|
||||
feature_index, &feature_type);
|
||||
|
||||
return ret;
|
||||
}
|
||||
@@ -3957,6 +3949,13 @@ static void hidpp_connect_event(struct hidpp_device *hidpp)
|
||||
}
|
||||
}
|
||||
|
||||
if (hidpp->protocol_major >= 2) {
|
||||
u8 feature_index;
|
||||
|
||||
if (!hidpp_get_wireless_feature_index(hidpp, &feature_index))
|
||||
hidpp->wireless_feature_index = feature_index;
|
||||
}
|
||||
|
||||
if (hidpp->name == hdev->name && hidpp->protocol_major >= 2) {
|
||||
name = hidpp_get_device_name(hidpp);
|
||||
if (name) {
|
||||
@@ -3993,7 +3992,7 @@ static void hidpp_connect_event(struct hidpp_device *hidpp)
|
||||
if (hidpp->quirks & HIDPP_QUIRK_HI_RES_SCROLL)
|
||||
hi_res_scroll_enable(hidpp);
|
||||
|
||||
if (!(hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT) || hidpp->delayed_input)
|
||||
if (!(hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT) || hidpp->delayed_input)
|
||||
/* if the input nodes are already created, we can stop now */
|
||||
return;
|
||||
|
||||
@@ -4096,7 +4095,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
bool connected;
|
||||
unsigned int connect_mask = HID_CONNECT_DEFAULT;
|
||||
struct hidpp_ff_private_data data;
|
||||
bool will_restart = false;
|
||||
|
||||
/* report_fixup needs drvdata to be set before we call hid_parse */
|
||||
hidpp = devm_kzalloc(&hdev->dev, sizeof(*hidpp), GFP_KERNEL);
|
||||
@@ -4137,11 +4135,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
hidpp_application_equals(hdev, HID_GD_KEYBOARD))
|
||||
hidpp->quirks |= HIDPP_QUIRK_HIDPP_CONSUMER_VENDOR_KEYS;
|
||||
|
||||
if (disable_raw_mode) {
|
||||
hidpp->quirks &= ~HIDPP_QUIRK_CLASS_WTP;
|
||||
hidpp->quirks &= ~HIDPP_QUIRK_NO_HIDINPUT;
|
||||
}
|
||||
|
||||
if (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP) {
|
||||
ret = wtp_allocate(hdev, id);
|
||||
if (ret)
|
||||
@@ -4152,10 +4145,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
return ret;
|
||||
}
|
||||
|
||||
if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT ||
|
||||
hidpp->quirks & HIDPP_QUIRK_UNIFYING)
|
||||
will_restart = true;
|
||||
|
||||
INIT_WORK(&hidpp->work, delayed_work_cb);
|
||||
mutex_init(&hidpp->send_mutex);
|
||||
init_waitqueue_head(&hidpp->wait);
|
||||
@@ -4167,10 +4156,12 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
hdev->name);
|
||||
|
||||
/*
|
||||
* Plain USB connections need to actually call start and open
|
||||
* on the transport driver to allow incoming data.
|
||||
* First call hid_hw_start(hdev, 0) to allow IO without connecting any
|
||||
* hid subdrivers (hid-input, hidraw). This allows retrieving the dev's
|
||||
* name and serial number and store these in hdev->name and hdev->uniq,
|
||||
* before the hid-input and hidraw drivers expose these to userspace.
|
||||
*/
|
||||
ret = hid_hw_start(hdev, will_restart ? 0 : connect_mask);
|
||||
ret = hid_hw_start(hdev, 0);
|
||||
if (ret) {
|
||||
hid_err(hdev, "hw start failed\n");
|
||||
goto hid_hw_start_fail;
|
||||
@@ -4203,15 +4194,6 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
hidpp_overwrite_name(hdev);
|
||||
}
|
||||
|
||||
if (connected && hidpp->protocol_major >= 2) {
|
||||
ret = hidpp_set_wireless_feature_index(hidpp);
|
||||
if (ret == -ENOENT)
|
||||
hidpp->wireless_feature_index = 0;
|
||||
else if (ret)
|
||||
goto hid_hw_init_fail;
|
||||
ret = 0;
|
||||
}
|
||||
|
||||
if (connected && (hidpp->quirks & HIDPP_QUIRK_CLASS_WTP)) {
|
||||
ret = wtp_get_config(hidpp);
|
||||
if (ret)
|
||||
@@ -4225,21 +4207,14 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
schedule_work(&hidpp->work);
|
||||
flush_work(&hidpp->work);
|
||||
|
||||
if (will_restart) {
|
||||
/* Reset the HID node state */
|
||||
hid_device_io_stop(hdev);
|
||||
hid_hw_close(hdev);
|
||||
hid_hw_stop(hdev);
|
||||
if (hidpp->quirks & HIDPP_QUIRK_DELAYED_INIT)
|
||||
connect_mask &= ~HID_CONNECT_HIDINPUT;
|
||||
|
||||
if (hidpp->quirks & HIDPP_QUIRK_NO_HIDINPUT)
|
||||
connect_mask &= ~HID_CONNECT_HIDINPUT;
|
||||
|
||||
/* Now export the actual inputs and hidraw nodes to the world */
|
||||
ret = hid_hw_start(hdev, connect_mask);
|
||||
if (ret) {
|
||||
hid_err(hdev, "%s:hid_hw_start returned error\n", __func__);
|
||||
goto hid_hw_start_fail;
|
||||
}
|
||||
/* Now export the actual inputs and hidraw nodes to the world */
|
||||
ret = hid_connect(hdev, connect_mask);
|
||||
if (ret) {
|
||||
hid_err(hdev, "%s:hid_connect returned error %d\n", __func__, ret);
|
||||
goto hid_hw_init_fail;
|
||||
}
|
||||
|
||||
if (hidpp->quirks & HIDPP_QUIRK_CLASS_G920) {
|
||||
@@ -4250,6 +4225,11 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id)
|
||||
ret);
|
||||
}
|
||||
|
||||
/*
|
||||
* This relies on logi_dj_ll_close() being a no-op so that DJ connection
|
||||
* events will still be received.
|
||||
*/
|
||||
hid_hw_close(hdev);
|
||||
return ret;
|
||||
|
||||
hid_hw_init_fail:
|
||||
|
||||
@@ -508,6 +508,21 @@ static int axi_fan_control_probe(struct platform_device *pdev)
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
ret = axi_fan_control_init(ctl, pdev->dev.of_node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to initialize device\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ctl->hdev = devm_hwmon_device_register_with_info(&pdev->dev,
|
||||
name,
|
||||
ctl,
|
||||
&axi_chip_info,
|
||||
axi_fan_control_groups);
|
||||
|
||||
if (IS_ERR(ctl->hdev))
|
||||
return PTR_ERR(ctl->hdev);
|
||||
|
||||
ctl->irq = platform_get_irq(pdev, 0);
|
||||
if (ctl->irq < 0)
|
||||
return ctl->irq;
|
||||
@@ -521,19 +536,7 @@ static int axi_fan_control_probe(struct platform_device *pdev)
|
||||
return ret;
|
||||
}
|
||||
|
||||
ret = axi_fan_control_init(ctl, pdev->dev.of_node);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "Failed to initialize device\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
ctl->hdev = devm_hwmon_device_register_with_info(&pdev->dev,
|
||||
name,
|
||||
ctl,
|
||||
&axi_chip_info,
|
||||
axi_fan_control_groups);
|
||||
|
||||
return PTR_ERR_OR_ZERO(ctl->hdev);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct platform_driver axi_fan_control_driver = {
|
||||
|
||||
@@ -41,7 +41,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");
|
||||
#define PKG_SYSFS_ATTR_NO 1 /* Sysfs attribute for package temp */
|
||||
#define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */
|
||||
#define NUM_REAL_CORES 128 /* Number of Real cores per cpu */
|
||||
#define CORETEMP_NAME_LENGTH 19 /* String Length of attrs */
|
||||
#define CORETEMP_NAME_LENGTH 28 /* String Length of attrs */
|
||||
#define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */
|
||||
#define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)
|
||||
#define MAX_CORE_DATA (NUM_REAL_CORES + BASE_SYSFS_ATTR_NO)
|
||||
|
||||
@@ -326,26 +326,44 @@ static void bcm_iproc_i2c_slave_init(
|
||||
iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
|
||||
}
|
||||
|
||||
static void bcm_iproc_i2c_check_slave_status(
|
||||
struct bcm_iproc_i2c_dev *iproc_i2c)
|
||||
static bool bcm_iproc_i2c_check_slave_status
|
||||
(struct bcm_iproc_i2c_dev *iproc_i2c, u32 status)
|
||||
{
|
||||
u32 val;
|
||||
bool recover = false;
|
||||
|
||||
val = iproc_i2c_rd_reg(iproc_i2c, S_CMD_OFFSET);
|
||||
/* status is valid only when START_BUSY is cleared after it was set */
|
||||
if (val & BIT(S_CMD_START_BUSY_SHIFT))
|
||||
return;
|
||||
/* check slave transmit status only if slave is transmitting */
|
||||
if (!iproc_i2c->slave_rx_only) {
|
||||
val = iproc_i2c_rd_reg(iproc_i2c, S_CMD_OFFSET);
|
||||
/* status is valid only when START_BUSY is cleared */
|
||||
if (!(val & BIT(S_CMD_START_BUSY_SHIFT))) {
|
||||
val = (val >> S_CMD_STATUS_SHIFT) & S_CMD_STATUS_MASK;
|
||||
if (val == S_CMD_STATUS_TIMEOUT ||
|
||||
val == S_CMD_STATUS_MASTER_ABORT) {
|
||||
dev_warn(iproc_i2c->device,
|
||||
(val == S_CMD_STATUS_TIMEOUT) ?
|
||||
"slave random stretch time timeout\n" :
|
||||
"Master aborted read transaction\n");
|
||||
recover = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val = (val >> S_CMD_STATUS_SHIFT) & S_CMD_STATUS_MASK;
|
||||
if (val == S_CMD_STATUS_TIMEOUT || val == S_CMD_STATUS_MASTER_ABORT) {
|
||||
dev_err(iproc_i2c->device, (val == S_CMD_STATUS_TIMEOUT) ?
|
||||
"slave random stretch time timeout\n" :
|
||||
"Master aborted read transaction\n");
|
||||
/* RX_EVENT is not valid when START_BUSY is set */
|
||||
if ((status & BIT(IS_S_RX_EVENT_SHIFT)) &&
|
||||
(status & BIT(IS_S_START_BUSY_SHIFT))) {
|
||||
dev_warn(iproc_i2c->device, "Slave aborted read transaction\n");
|
||||
recover = true;
|
||||
}
|
||||
|
||||
if (recover) {
|
||||
/* re-initialize i2c for recovery */
|
||||
bcm_iproc_i2c_enable_disable(iproc_i2c, false);
|
||||
bcm_iproc_i2c_slave_init(iproc_i2c, true);
|
||||
bcm_iproc_i2c_enable_disable(iproc_i2c, true);
|
||||
}
|
||||
|
||||
return recover;
|
||||
}
|
||||
|
||||
static void bcm_iproc_i2c_slave_read(struct bcm_iproc_i2c_dev *iproc_i2c)
|
||||
@@ -430,6 +448,64 @@ static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c,
|
||||
u32 val;
|
||||
u8 value;
|
||||
|
||||
|
||||
if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) {
|
||||
iproc_i2c->tx_underrun++;
|
||||
if (iproc_i2c->tx_underrun == 1)
|
||||
/* Start of SMBUS for Master Read */
|
||||
i2c_slave_event(iproc_i2c->slave,
|
||||
I2C_SLAVE_READ_REQUESTED,
|
||||
&value);
|
||||
else
|
||||
/* Master read other than start */
|
||||
i2c_slave_event(iproc_i2c->slave,
|
||||
I2C_SLAVE_READ_PROCESSED,
|
||||
&value);
|
||||
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value);
|
||||
/* start transfer */
|
||||
val = BIT(S_CMD_START_BUSY_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val);
|
||||
|
||||
/* clear interrupt */
|
||||
iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET,
|
||||
BIT(IS_S_TX_UNDERRUN_SHIFT));
|
||||
}
|
||||
|
||||
/* Stop received from master in case of master read transaction */
|
||||
if (status & BIT(IS_S_START_BUSY_SHIFT)) {
|
||||
/*
|
||||
* Disable interrupt for TX FIFO becomes empty and
|
||||
* less than PKT_LENGTH bytes were output on the SMBUS
|
||||
*/
|
||||
iproc_i2c->slave_int_mask &= ~BIT(IE_S_TX_UNDERRUN_SHIFT);
|
||||
val = iproc_i2c_rd_reg(iproc_i2c, IE_OFFSET);
|
||||
val &= ~BIT(IE_S_TX_UNDERRUN_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET, val);
|
||||
|
||||
/* End of SMBUS for Master Read */
|
||||
val = BIT(S_TX_WR_STATUS_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, val);
|
||||
|
||||
val = BIT(S_CMD_START_BUSY_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val);
|
||||
|
||||
/* flush TX FIFOs */
|
||||
val = iproc_i2c_rd_reg(iproc_i2c, S_FIFO_CTRL_OFFSET);
|
||||
val |= (BIT(S_FIFO_TX_FLUSH_SHIFT));
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val);
|
||||
|
||||
i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value);
|
||||
|
||||
/* clear interrupt */
|
||||
iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET,
|
||||
BIT(IS_S_START_BUSY_SHIFT));
|
||||
}
|
||||
|
||||
/* if the controller has been reset, immediately return from the ISR */
|
||||
if (bcm_iproc_i2c_check_slave_status(iproc_i2c, status))
|
||||
return true;
|
||||
|
||||
/*
|
||||
* Slave events in case of master-write, master-write-read and,
|
||||
* master-read
|
||||
@@ -463,72 +539,13 @@ static bool bcm_iproc_i2c_slave_isr(struct bcm_iproc_i2c_dev *iproc_i2c,
|
||||
/* schedule tasklet to read data later */
|
||||
tasklet_schedule(&iproc_i2c->slave_rx_tasklet);
|
||||
|
||||
/*
|
||||
* clear only IS_S_RX_EVENT_SHIFT and
|
||||
* IS_S_RX_FIFO_FULL_SHIFT interrupt.
|
||||
*/
|
||||
val = BIT(IS_S_RX_EVENT_SHIFT);
|
||||
if (status & BIT(IS_S_RX_FIFO_FULL_SHIFT))
|
||||
val |= BIT(IS_S_RX_FIFO_FULL_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, val);
|
||||
/* clear IS_S_RX_FIFO_FULL_SHIFT interrupt */
|
||||
if (status & BIT(IS_S_RX_FIFO_FULL_SHIFT)) {
|
||||
val = BIT(IS_S_RX_FIFO_FULL_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET, val);
|
||||
}
|
||||
}
|
||||
|
||||
if (status & BIT(IS_S_TX_UNDERRUN_SHIFT)) {
|
||||
iproc_i2c->tx_underrun++;
|
||||
if (iproc_i2c->tx_underrun == 1)
|
||||
/* Start of SMBUS for Master Read */
|
||||
i2c_slave_event(iproc_i2c->slave,
|
||||
I2C_SLAVE_READ_REQUESTED,
|
||||
&value);
|
||||
else
|
||||
/* Master read other than start */
|
||||
i2c_slave_event(iproc_i2c->slave,
|
||||
I2C_SLAVE_READ_PROCESSED,
|
||||
&value);
|
||||
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, value);
|
||||
/* start transfer */
|
||||
val = BIT(S_CMD_START_BUSY_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val);
|
||||
|
||||
/* clear interrupt */
|
||||
iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET,
|
||||
BIT(IS_S_TX_UNDERRUN_SHIFT));
|
||||
}
|
||||
|
||||
/* Stop received from master in case of master read transaction */
|
||||
if (status & BIT(IS_S_START_BUSY_SHIFT)) {
|
||||
/*
|
||||
* Disable interrupt for TX FIFO becomes empty and
|
||||
* less than PKT_LENGTH bytes were output on the SMBUS
|
||||
*/
|
||||
iproc_i2c->slave_int_mask &= ~BIT(IE_S_TX_UNDERRUN_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, IE_OFFSET,
|
||||
iproc_i2c->slave_int_mask);
|
||||
|
||||
/* End of SMBUS for Master Read */
|
||||
val = BIT(S_TX_WR_STATUS_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_TX_OFFSET, val);
|
||||
|
||||
val = BIT(S_CMD_START_BUSY_SHIFT);
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_CMD_OFFSET, val);
|
||||
|
||||
/* flush TX FIFOs */
|
||||
val = iproc_i2c_rd_reg(iproc_i2c, S_FIFO_CTRL_OFFSET);
|
||||
val |= (BIT(S_FIFO_TX_FLUSH_SHIFT));
|
||||
iproc_i2c_wr_reg(iproc_i2c, S_FIFO_CTRL_OFFSET, val);
|
||||
|
||||
i2c_slave_event(iproc_i2c->slave, I2C_SLAVE_STOP, &value);
|
||||
|
||||
/* clear interrupt */
|
||||
iproc_i2c_wr_reg(iproc_i2c, IS_OFFSET,
|
||||
BIT(IS_S_START_BUSY_SHIFT));
|
||||
}
|
||||
|
||||
/* check slave transmit status only if slave is transmitting */
|
||||
if (!iproc_i2c->slave_rx_only)
|
||||
bcm_iproc_i2c_check_slave_status(iproc_i2c);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user