Changes in 5.10.38
KEYS: trusted: Fix memory leak on object td
tpm: fix error return code in tpm2_get_cc_attrs_tbl()
tpm, tpm_tis: Extend locality handling to TPM2 in tpm_tis_gen_interrupt()
tpm, tpm_tis: Reserve locality in tpm_tis_resume()
KVM: x86/mmu: Remove the defunct update_pte() paging hook
KVM/VMX: Invoke NMI non-IST entry instead of IST entry
ACPI: PM: Add ACPI ID of Alder Lake Fan
PM: runtime: Fix unpaired parent child_count for force_resume
cpufreq: intel_pstate: Use HWP if enabled by platform firmware
kvm: Cap halt polling at kvm->max_halt_poll_ns
ath11k: fix thermal temperature read
fs: dlm: fix debugfs dump
fs: dlm: add errno handling to check callback
fs: dlm: check on minimum msglen size
fs: dlm: flush swork on shutdown
tipc: convert dest node's address to network order
ASoC: Intel: bytcr_rt5640: Enable jack-detect support on Asus T100TAF
net/mlx5e: Use net_prefetchw instead of prefetchw in MPWQE TX datapath
net: stmmac: Set FIFO sizes for ipq806x
ASoC: rsnd: core: Check convert rate in rsnd_hw_params
Bluetooth: Fix incorrect status handling in LE PHY UPDATE event
i2c: bail out early when RDWR parameters are wrong
ALSA: hdsp: don't disable if not enabled
ALSA: hdspm: don't disable if not enabled
ALSA: rme9652: don't disable if not enabled
ALSA: bebob: enable to deliver MIDI messages for multiple ports
Bluetooth: Set CONF_NOT_COMPLETE as l2cap_chan default
Bluetooth: initialize skb_queue_head at l2cap_chan_create()
net/sched: cls_flower: use ntohs for struct flow_dissector_key_ports
net: bridge: when suppression is enabled exclude RARP packets
Bluetooth: check for zapped sk before connecting
selftests/powerpc: Fix L1D flushing tests for Power10
powerpc/32: Statically initialise first emergency context
net: hns3: remediate a potential overflow risk of bd_num_list
net: hns3: add handling for xmit skb with recursive fraglist
ip6_vti: proper dev_{hold|put} in ndo_[un]init methods
ASoC: Intel: bytcr_rt5640: Add quirk for the Chuwi Hi8 tablet
ice: handle increasing Tx or Rx ring sizes
Bluetooth: btusb: Enable quirk boolean flag for Mediatek Chip.
ASoC: rt5670: Add a quirk for the Dell Venue 10 Pro 5055
i2c: Add I2C_AQ_NO_REP_START adapter quirk
MIPS: Loongson64: Use _CACHE_UNCACHED instead of _CACHE_UNCACHED_ACCELERATED
coresight: Do not scan for graph if none is present
IB/hfi1: Correct oversized ring allocation
mac80211: clear the beacon's CRC after channel switch
pinctrl: samsung: use 'int' for register masks in Exynos
rtw88: 8822c: add LC calibration for RTL8822C
mt76: mt7615: support loading EEPROM for MT7613BE
mt76: mt76x0: disable GTK offloading
mt76: mt7915: fix txpower init for TSSI off chips
fuse: invalidate attrs when page writeback completes
virtiofs: fix userns
cuse: prevent clone
iwlwifi: pcie: make cfg vs. trans_cfg more robust
powerpc/mm: Add cond_resched() while removing hpte mappings
ASoC: rsnd: call rsnd_ssi_master_clk_start() from rsnd_ssi_init()
Revert "iommu/amd: Fix performance counter initialization"
iommu/amd: Remove performance counter pre-initialization test
drm/amd/display: Force vsync flip when reconfiguring MPCC
selftests: Set CC to clang in lib.mk if LLVM is set
kconfig: nconf: stop endless search loops
ALSA: hda/realtek: Add quirk for Lenovo Ideapad S740
ASoC: Intel: sof_sdw: add quirk for new ADL-P Rvp
ALSA: hda/hdmi: fix race in handling acomp ELD notification at resume
sctp: Fix out-of-bounds warning in sctp_process_asconf_param()
flow_dissector: Fix out-of-bounds warning in __skb_flow_bpf_to_target()
powerpc/smp: Set numa node before updating mask
ASoC: rt286: Generalize support for ALC3263 codec
ethtool: ioctl: Fix out-of-bounds warning in store_link_ksettings_for_user()
net: sched: tapr: prevent cycle_time == 0 in parse_taprio_schedule
samples/bpf: Fix broken tracex1 due to kprobe argument change
powerpc/pseries: Stop calling printk in rtas_stop_self()
drm/amd/display: fixed divide by zero kernel crash during dsc enablement
drm/amd/display: add handling for hdcp2 rx id list validation
drm/amdgpu: Add mem sync flag for IB allocated by SA
mt76: mt7615: fix entering driver-own state on mt7663
crypto: ccp: Free SEV device if SEV init fails
wl3501_cs: Fix out-of-bounds warnings in wl3501_send_pkt
wl3501_cs: Fix out-of-bounds warnings in wl3501_mgmt_join
qtnfmac: Fix possible buffer overflow in qtnf_event_handle_external_auth
powerpc/iommu: Annotate nested lock for lockdep
iavf: remove duplicate free resources calls
net: ethernet: mtk_eth_soc: fix RX VLAN offload
selftests: mlxsw: Increase the tolerance of backlog buildup
selftests: mlxsw: Fix mausezahn invocation in ERSPAN scale test
kbuild: generate Module.symvers only when vmlinux exists
bnxt_en: Add PCI IDs for Hyper-V VF devices.
ia64: module: fix symbolizer crash on fdescr
watchdog: rename __touch_watchdog() to a better descriptive name
watchdog: explicitly update timestamp when reporting softlockup
watchdog/softlockup: remove logic that tried to prevent repeated reports
watchdog: fix barriers when printing backtraces from all CPUs
ASoC: rt286: Make RT286_SET_GPIO_* readable and writable
thermal: thermal_of: Fix error return code of thermal_of_populate_bind_params()
f2fs: move ioctl interface definitions to separated file
f2fs: fix compat F2FS_IOC_{MOVE,GARBAGE_COLLECT}_RANGE
f2fs: fix to allow migrating fully valid segment
f2fs: fix panic during f2fs_resize_fs()
f2fs: fix a redundant call to f2fs_balance_fs if an error occurs
remoteproc: qcom_q6v5_mss: Replace ioremap with memremap
remoteproc: qcom_q6v5_mss: Validate p_filesz in ELF loader
PCI: iproc: Fix return value of iproc_msi_irq_domain_alloc()
PCI: Release OF node in pci_scan_device()'s error path
ARM: 9064/1: hw_breakpoint: Do not directly check the event's overflow_handler hook
f2fs: fix to align to section for fallocate() on pinned file
f2fs: fix to update last i_size if fallocate partially succeeds
PCI: endpoint: Make *_get_first_free_bar() take into account 64 bit BAR
PCI: endpoint: Add helper API to get the 'next' unreserved BAR
PCI: endpoint: Make *_free_bar() to return error codes on failure
PCI: endpoint: Fix NULL pointer dereference for ->get_features()
f2fs: fix to avoid touching checkpointed data in get_victim()
f2fs: fix to cover __allocate_new_section() with curseg_lock
f2fs: Fix a hungtask problem in atomic write
f2fs: fix to avoid accessing invalid fio in f2fs_allocate_data_block()
rpmsg: qcom_glink_native: fix error return code of qcom_glink_rx_data()
NFS: nfs4_bitmask_adjust() must not change the server global bitmasks
NFS: Fix attribute bitmask in _nfs42_proc_fallocate()
NFSv4.2: Always flush out writes in nfs42_proc_fallocate()
NFS: Deal correctly with attribute generation counter overflow
PCI: endpoint: Fix missing destroy_workqueue()
pNFS/flexfiles: fix incorrect size check in decode_nfs_fh()
NFSv4.2 fix handling of sr_eof in SEEK's reply
SUNRPC: Move fault injection call sites
SUNRPC: Remove trace_xprt_transmit_queued
SUNRPC: Handle major timeout in xprt_adjust_timeout()
thermal/drivers/tsens: Fix missing put_device error
NFSv4.x: Don't return NFS4ERR_NOMATCHING_LAYOUT if we're unmounting
nfsd: ensure new clients break delegations
rtc: fsl-ftm-alarm: add MODULE_TABLE()
dmaengine: idxd: Fix potential null dereference on pointer status
dmaengine: idxd: fix dma device lifetime
dmaengine: idxd: fix cdev setup and free device lifetime issues
SUNRPC: fix ternary sign expansion bug in tracing
pwm: atmel: Fix duty cycle calculation in .get_state()
xprtrdma: Avoid Receive Queue wrapping
xprtrdma: Fix cwnd update ordering
xprtrdma: rpcrdma_mr_pop() already does list_del_init()
swiotlb: Fix the type of index
ceph: fix inode leak on getattr error in __fh_to_dentry
scsi: qla2xxx: Prevent PRLI in target mode
scsi: ufs: core: Do not put UFS power into LPM if link is broken
scsi: ufs: core: Cancel rpm_dev_flush_recheck_work during system suspend
scsi: ufs: core: Narrow down fast path in system suspend path
rtc: ds1307: Fix wday settings for rx8130
net: hns3: fix incorrect configuration for igu_egu_hw_err
net: hns3: initialize the message content in hclge_get_link_mode()
net: hns3: add check for HNS3_NIC_STATE_INITED in hns3_reset_notify_up_enet()
net: hns3: fix for vxlan gpe tx checksum bug
net: hns3: use netif_tx_disable to stop the transmit queue
net: hns3: disable phy loopback setting in hclge_mac_start_phy
sctp: do asoc update earlier in sctp_sf_do_dupcook_a
RISC-V: Fix error code returned by riscv_hartid_to_cpuid()
sunrpc: Fix misplaced barrier in call_decode
libbpf: Fix signed overflow in ringbuf_process_ring
block/rnbd-clt: Change queue_depth type in rnbd_clt_session to size_t
block/rnbd-clt: Check the return value of the function rtrs_clt_query
ethernet:enic: Fix a use after free bug in enic_hard_start_xmit
sctp: fix a SCTP_MIB_CURRESTAB leak in sctp_sf_do_dupcook_b
netfilter: xt_SECMARK: add new revision to fix structure layout
xsk: Fix for xp_aligned_validate_desc() when len == chunk_size
net: stmmac: Clear receive all(RA) bit when promiscuous mode is off
drm/radeon: Fix off-by-one power_state index heap overwrite
drm/radeon: Avoid power table parsing memory leaks
arm64: entry: factor irq triage logic into macros
arm64: entry: always set GIC_PRIO_PSR_I_SET during entry
khugepaged: fix wrong result value for trace_mm_collapse_huge_page_isolate()
mm/hugeltb: handle the error case in hugetlb_fix_reserve_counts()
mm/migrate.c: fix potential indeterminate pte entry in migrate_vma_insert_page()
ksm: fix potential missing rmap_item for stable_node
mm/gup: check every subpage of a compound page during isolation
mm/gup: return an error on migration failure
mm/gup: check for isolation errors
ethtool: fix missing NLM_F_MULTI flag when dumping
net: fix nla_strcmp to handle more then one trailing null character
smc: disallow TCP_ULP in smc_setsockopt()
netfilter: nfnetlink_osf: Fix a missing skb_header_pointer() NULL check
netfilter: nftables: Fix a memleak from userdata error path in new objects
can: mcp251xfd: mcp251xfd_probe(): add missing can_rx_offload_del() in error path
can: mcp251x: fix resume from sleep before interface was brought up
can: m_can: m_can_tx_work_queue(): fix tx_skb race condition
sched: Fix out-of-bound access in uclamp
sched/fair: Fix unfairness caused by missing load decay
fs/proc/generic.c: fix incorrect pde_is_permanent check
kernel: kexec_file: fix error return code of kexec_calculate_store_digests()
kernel/resource: make walk_system_ram_res() find all busy IORESOURCE_SYSTEM_RAM resources
kernel/resource: make walk_mem_res() find all busy IORESOURCE_MEM resources
netfilter: nftables: avoid overflows in nft_hash_buckets()
i40e: fix broken XDP support
i40e: Fix use-after-free in i40e_client_subtask()
i40e: fix the restart auto-negotiation after FEC modified
i40e: Fix PHY type identifiers for 2.5G and 5G adapters
mptcp: fix splat when closing unaccepted socket
f2fs: avoid unneeded data copy in f2fs_ioc_move_range()
ARC: entry: fix off-by-one error in syscall number validation
ARC: mm: PAE: use 40-bit physical page mask
ARC: mm: Use max_high_pfn as a HIGHMEM zone border
powerpc/64s: Fix crashes when toggling stf barrier
powerpc/64s: Fix crashes when toggling entry flush barrier
hfsplus: prevent corruption in shrinking truncate
squashfs: fix divide error in calculate_skip()
userfaultfd: release page in error path to avoid BUG_ON
kasan: fix unit tests with CONFIG_UBSAN_LOCAL_BOUNDS enabled
mm/hugetlb: fix F_SEAL_FUTURE_WRITE
blk-iocost: fix weight updates of inner active iocgs
arm64: mte: initialize RGSR_EL1.SEED in __cpu_setup
arm64: Fix race condition on PG_dcache_clean in __sync_icache_dcache()
btrfs: fix race leading to unpersisted data and metadata on fsync
drm/radeon/dpm: Disable sclk switching on Oland when two 4K 60Hz monitors are connected
drm/amd/display: Initialize attribute for hdcp_srm sysfs file
drm/i915: Avoid div-by-zero on gen2
kvm: exit halt polling on need_resched() as well
KVM: LAPIC: Accurately guarantee busy wait for timer to expire when using hv_timer
drm/msm/dp: initialize audio_comp when audio starts
KVM: x86: Cancel pvclock_gtod_work on module removal
KVM: x86: Prevent deadlock against tk_core.seq
dax: Add an enum for specifying dax wakup mode
dax: Add a wakeup mode parameter to put_unlocked_entry()
dax: Wake up all waiters after invalidating dax entry
xen/unpopulated-alloc: consolidate pgmap manipulation
xen/unpopulated-alloc: fix error return code in fill_list()
perf tools: Fix dynamic libbpf link
usb: dwc3: gadget: Free gadget structure only after freeing endpoints
iio: light: gp2ap002: Fix rumtime PM imbalance on error
iio: proximity: pulsedlight: Fix rumtime PM imbalance on error
iio: hid-sensors: select IIO_TRIGGERED_BUFFER under HID_SENSOR_IIO_TRIGGER
usb: fotg210-hcd: Fix an error message
hwmon: (occ) Fix poll rate limiting
usb: musb: Fix an error message
ACPI: scan: Fix a memory leak in an error handling path
kyber: fix out of bounds access when preempted
nvmet: add lba to sect conversion helpers
nvmet: fix inline bio check for bdev-ns
nvmet-rdma: Fix NULL deref when SEND is completed with error
f2fs: compress: fix to free compress page correctly
f2fs: compress: fix race condition of overwrite vs truncate
f2fs: compress: fix to assign cc.cluster_idx correctly
nbd: Fix NULL pointer in flush_workqueue
blk-mq: plug request for shared sbitmap
blk-mq: Swap two calls in blk_mq_exit_queue()
usb: dwc3: omap: improve extcon initialization
usb: dwc3: pci: Enable usb2-gadget-lpm-disable for Intel Merrifield
usb: xhci: Increase timeout for HC halt
usb: dwc2: Fix gadget DMA unmap direction
usb: core: hub: fix race condition about TRSMRCY of resume
usb: dwc3: gadget: Enable suspend events
usb: dwc3: gadget: Return success always for kick transfer in ep queue
usb: typec: ucsi: Retrieve all the PDOs instead of just the first 4
usb: typec: ucsi: Put fwnode in any case during ->probe()
xhci-pci: Allow host runtime PM as default for Intel Alder Lake xHCI
xhci: Do not use GFP_KERNEL in (potentially) atomic context
xhci: Add reset resume quirk for AMD xhci controller.
iio: gyro: mpu3050: Fix reported temperature value
iio: tsl2583: Fix division by a zero lux_val
cdc-wdm: untangle a circular dependency between callback and softint
xen/gntdev: fix gntdev_mmap() error exit path
KVM: x86: Emulate RDPID only if RDTSCP is supported
KVM: x86: Move RDPID emulation intercept to its own enum
KVM: nVMX: Always make an attempt to map eVMCS after migration
KVM: VMX: Do not advertise RDPID if ENABLE_RDTSCP control is unsupported
KVM: VMX: Disable preemption when probing user return MSRs
Revert "iommu/vt-d: Remove WO permissions on second-level paging entries"
Revert "iommu/vt-d: Preset Access/Dirty bits for IOVA over FL"
iommu/vt-d: Preset Access/Dirty bits for IOVA over FL
iommu/vt-d: Remove WO permissions on second-level paging entries
mm: fix struct page layout on 32-bit systems
MIPS: Reinstate platform `__div64_32' handler
MIPS: Avoid DIVU in `__div64_32' is result would be zero
MIPS: Avoid handcoded DIVU in `__div64_32' altogether
clocksource/drivers/timer-ti-dm: Prepare to handle dra7 timer wrap issue
clocksource/drivers/timer-ti-dm: Handle dra7 timer wrap errata i940
ARM: 9011/1: centralize phys-to-virt conversion of DT/ATAGS address
ARM: 9012/1: move device tree mapping out of linear region
ARM: 9020/1: mm: use correct section size macro to describe the FDT virtual address
ARM: 9027/1: head.S: explicitly map DT even if it lives in the first physical section
usb: typec: tcpm: Fix error while calculating PPS out values
kobject_uevent: remove warning in init_uevent_argv()
drm/i915/gt: Fix a double free in gen8_preallocate_top_level_pdp
drm/i915: Read C0DRB3/C1DRB3 as 16 bits again
drm/i915/overlay: Fix active retire callback alignment
drm/i915: Fix crash in auto_retire
clk: exynos7: Mark aclk_fsys1_200 as critical
media: rkvdec: Remove of_match_ptr()
i2c: mediatek: Fix send master code at more than 1MHz
dt-bindings: media: renesas,vin: Make resets optional on R-Car Gen1
dt-bindings: serial: 8250: Remove duplicated compatible strings
debugfs: Make debugfs_allow RO after init
ext4: fix debug format string warning
nvme: do not try to reconfigure APST when the controller is not live
ASoC: rsnd: check all BUSIF status when error
Linux 5.10.38
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Change-Id: Ia32e01283b488a38be48015c58a0e481f09aaf65
493 lines
13 KiB
C
493 lines
13 KiB
C
// SPDX-License-Identifier: GPL-2.0
|
|
/**
|
|
* dwc3-pci.c - PCI Specific glue layer
|
|
*
|
|
* Copyright (C) 2010-2011 Texas Instruments Incorporated - https://www.ti.com
|
|
*
|
|
* Authors: Felipe Balbi <balbi@ti.com>,
|
|
* Sebastian Andrzej Siewior <bigeasy@linutronix.de>
|
|
*/
|
|
|
|
#include <linux/kernel.h>
|
|
#include <linux/module.h>
|
|
#include <linux/slab.h>
|
|
#include <linux/pci.h>
|
|
#include <linux/workqueue.h>
|
|
#include <linux/pm_runtime.h>
|
|
#include <linux/platform_device.h>
|
|
#include <linux/gpio/consumer.h>
|
|
#include <linux/gpio/machine.h>
|
|
#include <linux/acpi.h>
|
|
#include <linux/delay.h>
|
|
|
|
#define PCI_DEVICE_ID_INTEL_BYT 0x0f37
|
|
#define PCI_DEVICE_ID_INTEL_MRFLD 0x119e
|
|
#define PCI_DEVICE_ID_INTEL_BSW 0x22b7
|
|
#define PCI_DEVICE_ID_INTEL_SPTLP 0x9d30
|
|
#define PCI_DEVICE_ID_INTEL_SPTH 0xa130
|
|
#define PCI_DEVICE_ID_INTEL_BXT 0x0aaa
|
|
#define PCI_DEVICE_ID_INTEL_BXT_M 0x1aaa
|
|
#define PCI_DEVICE_ID_INTEL_APL 0x5aaa
|
|
#define PCI_DEVICE_ID_INTEL_KBP 0xa2b0
|
|
#define PCI_DEVICE_ID_INTEL_CMLLP 0x02ee
|
|
#define PCI_DEVICE_ID_INTEL_CMLH 0x06ee
|
|
#define PCI_DEVICE_ID_INTEL_GLK 0x31aa
|
|
#define PCI_DEVICE_ID_INTEL_CNPLP 0x9dee
|
|
#define PCI_DEVICE_ID_INTEL_CNPH 0xa36e
|
|
#define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0
|
|
#define PCI_DEVICE_ID_INTEL_ICLLP 0x34ee
|
|
#define PCI_DEVICE_ID_INTEL_EHLLP 0x4b7e
|
|
#define PCI_DEVICE_ID_INTEL_TGPLP 0xa0ee
|
|
#define PCI_DEVICE_ID_INTEL_TGPH 0x43ee
|
|
#define PCI_DEVICE_ID_INTEL_JSP 0x4dee
|
|
#define PCI_DEVICE_ID_INTEL_ADLP 0x51ee
|
|
#define PCI_DEVICE_ID_INTEL_ADLS 0x7ae1
|
|
#define PCI_DEVICE_ID_INTEL_TGL 0x9a15
|
|
|
|
#define PCI_INTEL_BXT_DSM_GUID "732b85d5-b7a7-4a1b-9ba0-4bbd00ffd511"
|
|
#define PCI_INTEL_BXT_FUNC_PMU_PWR 4
|
|
#define PCI_INTEL_BXT_STATE_D0 0
|
|
#define PCI_INTEL_BXT_STATE_D3 3
|
|
|
|
#define GP_RWBAR 1
|
|
#define GP_RWREG1 0xa0
|
|
#define GP_RWREG1_ULPI_REFCLK_DISABLE (1 << 17)
|
|
|
|
/**
|
|
* struct dwc3_pci - Driver private structure
|
|
* @dwc3: child dwc3 platform_device
|
|
* @pci: our link to PCI bus
|
|
* @guid: _DSM GUID
|
|
* @has_dsm_for_pm: true for devices which need to run _DSM on runtime PM
|
|
* @wakeup_work: work for asynchronous resume
|
|
*/
|
|
struct dwc3_pci {
|
|
struct platform_device *dwc3;
|
|
struct pci_dev *pci;
|
|
|
|
guid_t guid;
|
|
|
|
unsigned int has_dsm_for_pm:1;
|
|
struct work_struct wakeup_work;
|
|
};
|
|
|
|
static const struct acpi_gpio_params reset_gpios = { 0, 0, false };
|
|
static const struct acpi_gpio_params cs_gpios = { 1, 0, false };
|
|
|
|
static const struct acpi_gpio_mapping acpi_dwc3_byt_gpios[] = {
|
|
{ "reset-gpios", &reset_gpios, 1 },
|
|
{ "cs-gpios", &cs_gpios, 1 },
|
|
{ },
|
|
};
|
|
|
|
static struct gpiod_lookup_table platform_bytcr_gpios = {
|
|
.dev_id = "0000:00:16.0",
|
|
.table = {
|
|
GPIO_LOOKUP("INT33FC:00", 54, "reset", GPIO_ACTIVE_HIGH),
|
|
GPIO_LOOKUP("INT33FC:02", 14, "cs", GPIO_ACTIVE_HIGH),
|
|
{}
|
|
},
|
|
};
|
|
|
|
static int dwc3_byt_enable_ulpi_refclock(struct pci_dev *pci)
|
|
{
|
|
void __iomem *reg;
|
|
u32 value;
|
|
|
|
reg = pcim_iomap(pci, GP_RWBAR, 0);
|
|
if (!reg)
|
|
return -ENOMEM;
|
|
|
|
value = readl(reg + GP_RWREG1);
|
|
if (!(value & GP_RWREG1_ULPI_REFCLK_DISABLE))
|
|
goto unmap; /* ULPI refclk already enabled */
|
|
|
|
value &= ~GP_RWREG1_ULPI_REFCLK_DISABLE;
|
|
writel(value, reg + GP_RWREG1);
|
|
/* This comes from the Intel Android x86 tree w/o any explanation */
|
|
msleep(100);
|
|
unmap:
|
|
pcim_iounmap(pci, reg);
|
|
return 0;
|
|
}
|
|
|
|
static const struct property_entry dwc3_pci_intel_properties[] = {
|
|
PROPERTY_ENTRY_STRING("dr_mode", "peripheral"),
|
|
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
|
|
{}
|
|
};
|
|
|
|
static const struct property_entry dwc3_pci_mrfld_properties[] = {
|
|
PROPERTY_ENTRY_STRING("dr_mode", "otg"),
|
|
PROPERTY_ENTRY_STRING("linux,extcon-name", "mrfld_bcove_pwrsrc"),
|
|
PROPERTY_ENTRY_BOOL("snps,dis_u3_susphy_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,dis_u2_susphy_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,usb2-gadget-lpm-disable"),
|
|
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
|
|
{}
|
|
};
|
|
|
|
static const struct property_entry dwc3_pci_amd_properties[] = {
|
|
PROPERTY_ENTRY_BOOL("snps,has-lpm-erratum"),
|
|
PROPERTY_ENTRY_U8("snps,lpm-nyet-threshold", 0xf),
|
|
PROPERTY_ENTRY_BOOL("snps,u2exit_lfps_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,u2ss_inp3_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,req_p1p2p3_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,del_p1p2p3_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,del_phy_power_chg_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,lfps_filter_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,rx_detect_poll_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,tx_de_emphasis_quirk"),
|
|
PROPERTY_ENTRY_U8("snps,tx_de_emphasis", 1),
|
|
/* FIXME these quirks should be removed when AMD NL tapes out */
|
|
PROPERTY_ENTRY_BOOL("snps,disable_scramble_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,dis_u3_susphy_quirk"),
|
|
PROPERTY_ENTRY_BOOL("snps,dis_u2_susphy_quirk"),
|
|
PROPERTY_ENTRY_BOOL("linux,sysdev_is_parent"),
|
|
{}
|
|
};
|
|
|
|
static const struct software_node dwc3_pci_intel_swnode = {
|
|
.properties = dwc3_pci_intel_properties,
|
|
};
|
|
|
|
static const struct software_node dwc3_pci_intel_mrfld_swnode = {
|
|
.properties = dwc3_pci_mrfld_properties,
|
|
};
|
|
|
|
static const struct software_node dwc3_pci_amd_swnode = {
|
|
.properties = dwc3_pci_amd_properties,
|
|
};
|
|
|
|
static int dwc3_pci_quirks(struct dwc3_pci *dwc)
|
|
{
|
|
struct pci_dev *pdev = dwc->pci;
|
|
|
|
if (pdev->vendor == PCI_VENDOR_ID_INTEL) {
|
|
if (pdev->device == PCI_DEVICE_ID_INTEL_BXT ||
|
|
pdev->device == PCI_DEVICE_ID_INTEL_BXT_M ||
|
|
pdev->device == PCI_DEVICE_ID_INTEL_EHLLP) {
|
|
guid_parse(PCI_INTEL_BXT_DSM_GUID, &dwc->guid);
|
|
dwc->has_dsm_for_pm = true;
|
|
}
|
|
|
|
if (pdev->device == PCI_DEVICE_ID_INTEL_BYT) {
|
|
struct gpio_desc *gpio;
|
|
int ret;
|
|
|
|
/* On BYT the FW does not always enable the refclock */
|
|
ret = dwc3_byt_enable_ulpi_refclock(pdev);
|
|
if (ret)
|
|
return ret;
|
|
|
|
ret = devm_acpi_dev_add_driver_gpios(&pdev->dev,
|
|
acpi_dwc3_byt_gpios);
|
|
if (ret)
|
|
dev_dbg(&pdev->dev, "failed to add mapping table\n");
|
|
|
|
/*
|
|
* A lot of BYT devices lack ACPI resource entries for
|
|
* the GPIOs, add a fallback mapping to the reference
|
|
* design GPIOs which all boards seem to use.
|
|
*/
|
|
gpiod_add_lookup_table(&platform_bytcr_gpios);
|
|
|
|
/*
|
|
* These GPIOs will turn on the USB2 PHY. Note that we have to
|
|
* put the gpio descriptors again here because the phy driver
|
|
* might want to grab them, too.
|
|
*/
|
|
gpio = gpiod_get_optional(&pdev->dev, "cs", GPIOD_OUT_LOW);
|
|
if (IS_ERR(gpio))
|
|
return PTR_ERR(gpio);
|
|
|
|
gpiod_set_value_cansleep(gpio, 1);
|
|
gpiod_put(gpio);
|
|
|
|
gpio = gpiod_get_optional(&pdev->dev, "reset", GPIOD_OUT_LOW);
|
|
if (IS_ERR(gpio))
|
|
return PTR_ERR(gpio);
|
|
|
|
if (gpio) {
|
|
gpiod_set_value_cansleep(gpio, 1);
|
|
gpiod_put(gpio);
|
|
usleep_range(10000, 11000);
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#ifdef CONFIG_PM
|
|
static void dwc3_pci_resume_work(struct work_struct *work)
|
|
{
|
|
struct dwc3_pci *dwc = container_of(work, struct dwc3_pci, wakeup_work);
|
|
struct platform_device *dwc3 = dwc->dwc3;
|
|
int ret;
|
|
|
|
ret = pm_runtime_get_sync(&dwc3->dev);
|
|
if (ret) {
|
|
pm_runtime_put_sync_autosuspend(&dwc3->dev);
|
|
return;
|
|
}
|
|
|
|
pm_runtime_mark_last_busy(&dwc3->dev);
|
|
pm_runtime_put_sync_autosuspend(&dwc3->dev);
|
|
}
|
|
#endif
|
|
|
|
static int dwc3_pci_probe(struct pci_dev *pci, const struct pci_device_id *id)
|
|
{
|
|
struct dwc3_pci *dwc;
|
|
struct resource res[2];
|
|
int ret;
|
|
struct device *dev = &pci->dev;
|
|
|
|
ret = pcim_enable_device(pci);
|
|
if (ret) {
|
|
dev_err(dev, "failed to enable pci device\n");
|
|
return -ENODEV;
|
|
}
|
|
|
|
pci_set_master(pci);
|
|
|
|
dwc = devm_kzalloc(dev, sizeof(*dwc), GFP_KERNEL);
|
|
if (!dwc)
|
|
return -ENOMEM;
|
|
|
|
dwc->dwc3 = platform_device_alloc("dwc3", PLATFORM_DEVID_AUTO);
|
|
if (!dwc->dwc3)
|
|
return -ENOMEM;
|
|
|
|
memset(res, 0x00, sizeof(struct resource) * ARRAY_SIZE(res));
|
|
|
|
res[0].start = pci_resource_start(pci, 0);
|
|
res[0].end = pci_resource_end(pci, 0);
|
|
res[0].name = "dwc_usb3";
|
|
res[0].flags = IORESOURCE_MEM;
|
|
|
|
res[1].start = pci->irq;
|
|
res[1].name = "dwc_usb3";
|
|
res[1].flags = IORESOURCE_IRQ;
|
|
|
|
ret = platform_device_add_resources(dwc->dwc3, res, ARRAY_SIZE(res));
|
|
if (ret) {
|
|
dev_err(dev, "couldn't add resources to dwc3 device\n");
|
|
goto err;
|
|
}
|
|
|
|
dwc->pci = pci;
|
|
dwc->dwc3->dev.parent = dev;
|
|
ACPI_COMPANION_SET(&dwc->dwc3->dev, ACPI_COMPANION(dev));
|
|
|
|
ret = device_add_software_node(&dwc->dwc3->dev, (void *)id->driver_data);
|
|
if (ret < 0)
|
|
goto err;
|
|
|
|
ret = dwc3_pci_quirks(dwc);
|
|
if (ret)
|
|
goto err;
|
|
|
|
ret = platform_device_add(dwc->dwc3);
|
|
if (ret) {
|
|
dev_err(dev, "failed to register dwc3 device\n");
|
|
goto err;
|
|
}
|
|
|
|
device_init_wakeup(dev, true);
|
|
pci_set_drvdata(pci, dwc);
|
|
pm_runtime_put(dev);
|
|
#ifdef CONFIG_PM
|
|
INIT_WORK(&dwc->wakeup_work, dwc3_pci_resume_work);
|
|
#endif
|
|
|
|
return 0;
|
|
err:
|
|
device_remove_software_node(&dwc->dwc3->dev);
|
|
platform_device_put(dwc->dwc3);
|
|
return ret;
|
|
}
|
|
|
|
static void dwc3_pci_remove(struct pci_dev *pci)
|
|
{
|
|
struct dwc3_pci *dwc = pci_get_drvdata(pci);
|
|
struct pci_dev *pdev = dwc->pci;
|
|
|
|
if (pdev->device == PCI_DEVICE_ID_INTEL_BYT)
|
|
gpiod_remove_lookup_table(&platform_bytcr_gpios);
|
|
#ifdef CONFIG_PM
|
|
cancel_work_sync(&dwc->wakeup_work);
|
|
#endif
|
|
device_init_wakeup(&pci->dev, false);
|
|
pm_runtime_get(&pci->dev);
|
|
device_remove_software_node(&dwc->dwc3->dev);
|
|
platform_device_unregister(dwc->dwc3);
|
|
}
|
|
|
|
static const struct pci_device_id dwc3_pci_id_table[] = {
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BSW),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BYT),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_MRFLD),
|
|
(kernel_ulong_t) &dwc3_pci_intel_mrfld_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CMLH),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SPTLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_SPTH),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BXT),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_BXT_M),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_APL),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_KBP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_GLK),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPH),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_CNPV),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ICLLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_EHLLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGPH),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_JSP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLP),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_ADLS),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(INTEL, PCI_DEVICE_ID_INTEL_TGL),
|
|
(kernel_ulong_t) &dwc3_pci_intel_swnode, },
|
|
|
|
{ PCI_VDEVICE(AMD, PCI_DEVICE_ID_AMD_NL_USB),
|
|
(kernel_ulong_t) &dwc3_pci_amd_swnode, },
|
|
{ } /* Terminating Entry */
|
|
};
|
|
MODULE_DEVICE_TABLE(pci, dwc3_pci_id_table);
|
|
|
|
#if defined(CONFIG_PM) || defined(CONFIG_PM_SLEEP)
|
|
static int dwc3_pci_dsm(struct dwc3_pci *dwc, int param)
|
|
{
|
|
union acpi_object *obj;
|
|
union acpi_object tmp;
|
|
union acpi_object argv4 = ACPI_INIT_DSM_ARGV4(1, &tmp);
|
|
|
|
if (!dwc->has_dsm_for_pm)
|
|
return 0;
|
|
|
|
tmp.type = ACPI_TYPE_INTEGER;
|
|
tmp.integer.value = param;
|
|
|
|
obj = acpi_evaluate_dsm(ACPI_HANDLE(&dwc->pci->dev), &dwc->guid,
|
|
1, PCI_INTEL_BXT_FUNC_PMU_PWR, &argv4);
|
|
if (!obj) {
|
|
dev_err(&dwc->pci->dev, "failed to evaluate _DSM\n");
|
|
return -EIO;
|
|
}
|
|
|
|
ACPI_FREE(obj);
|
|
|
|
return 0;
|
|
}
|
|
#endif /* CONFIG_PM || CONFIG_PM_SLEEP */
|
|
|
|
#ifdef CONFIG_PM
|
|
static int dwc3_pci_runtime_suspend(struct device *dev)
|
|
{
|
|
struct dwc3_pci *dwc = dev_get_drvdata(dev);
|
|
|
|
if (device_can_wakeup(dev))
|
|
return dwc3_pci_dsm(dwc, PCI_INTEL_BXT_STATE_D3);
|
|
|
|
return -EBUSY;
|
|
}
|
|
|
|
static int dwc3_pci_runtime_resume(struct device *dev)
|
|
{
|
|
struct dwc3_pci *dwc = dev_get_drvdata(dev);
|
|
int ret;
|
|
|
|
ret = dwc3_pci_dsm(dwc, PCI_INTEL_BXT_STATE_D0);
|
|
if (ret)
|
|
return ret;
|
|
|
|
queue_work(pm_wq, &dwc->wakeup_work);
|
|
|
|
return 0;
|
|
}
|
|
#endif /* CONFIG_PM */
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
static int dwc3_pci_suspend(struct device *dev)
|
|
{
|
|
struct dwc3_pci *dwc = dev_get_drvdata(dev);
|
|
|
|
return dwc3_pci_dsm(dwc, PCI_INTEL_BXT_STATE_D3);
|
|
}
|
|
|
|
static int dwc3_pci_resume(struct device *dev)
|
|
{
|
|
struct dwc3_pci *dwc = dev_get_drvdata(dev);
|
|
|
|
return dwc3_pci_dsm(dwc, PCI_INTEL_BXT_STATE_D0);
|
|
}
|
|
#endif /* CONFIG_PM_SLEEP */
|
|
|
|
static const struct dev_pm_ops dwc3_pci_dev_pm_ops = {
|
|
SET_SYSTEM_SLEEP_PM_OPS(dwc3_pci_suspend, dwc3_pci_resume)
|
|
SET_RUNTIME_PM_OPS(dwc3_pci_runtime_suspend, dwc3_pci_runtime_resume,
|
|
NULL)
|
|
};
|
|
|
|
static struct pci_driver dwc3_pci_driver = {
|
|
.name = "dwc3-pci",
|
|
.id_table = dwc3_pci_id_table,
|
|
.probe = dwc3_pci_probe,
|
|
.remove = dwc3_pci_remove,
|
|
.driver = {
|
|
.pm = &dwc3_pci_dev_pm_ops,
|
|
}
|
|
};
|
|
|
|
MODULE_AUTHOR("Felipe Balbi <balbi@ti.com>");
|
|
MODULE_LICENSE("GPL v2");
|
|
MODULE_DESCRIPTION("DesignWare USB3 PCI Glue Layer");
|
|
|
|
module_pci_driver(dwc3_pci_driver);
|