This is the 4.9.208 stable release
-----BEGIN PGP SIGNATURE----- iQIzBAABCAAdFiEEZH8oZUiU471FcZm+ONu9yGCSaT4FAl4Qh+sACgkQONu9yGCS aT7sUQ/+P+dg9KWYEUxPUaSrZ3N8yvFTI2GlVWVv9MMrl/TQPU4jLVoFXxpaQd+i 4MIlgs6a/FEPJWZbsJZP7DCMcIOX3wEbaV4IdHDD67W6sK8A2kUL7Rz7kVEz1/Gi o3Z0aep0kScIoY7gIOJXxypreg983odXouyEiP2OMKUNkPWpJqa+kG3XCYWOMnoP ak9+gOGVlyVY2rgxHcAIS1IFUhM6QBmTRy78B9vRr/c4OLTwKR9S2AyY9LYX3FsA Y4cxXzxFdgHROXg7ev2Xebor2bnrJR6jI2/7BlNLZ7mv/GTKe3UbgLqPcmiqIJ0l ybiiDIqs62K/UFW187H3UEwrHzPZcA5eacKk5dX5wTPEiJIMSnhlUKUcNBNFMDEf YWeDgd5oxAKyEe8uDTUynQJLa4SpyGpgkWuipEjpih7VlYKXsNsGIMsKnZT30xFO dUe6GRaflx/fAU2X5W56o+NfND8QwCaODPfhWXnFUBNK2UP8qortIUBvqqvv+h8g mi+FWskrkG+UPHa6WrLoHvhbRzWZ55I4hS3cnDTJfZ+GyQViiEFIFwh+yQV7s9T6 MWDWzAkK+gMqAIKtHlJA5h7CoFCVUWc804FpFVBT0/ew1fS1ji2kR+RPg7JaJUrU /1aoBlsaPI9T/W4na/d6pxJG6CsjNUZCbRIIvk++xfF4qNZuPg4= =brIz -----END PGP SIGNATURE----- Merge 4.9.208 into android-4.9-q Changes in 4.9.208 btrfs: skip log replay on orphaned roots btrfs: do not leak reloc root if we fail to read the fs root btrfs: handle ENOENT in btrfs_uuid_tree_iterate ALSA: pcm: Avoid possible info leaks from PCM stream buffers ALSA: hda/ca0132 - Keep power on during processing DSP response ALSA: hda/ca0132 - Avoid endless loop drm: mst: Fix query_payload ack reply struct drm/bridge: analogix-anx78xx: silence -EPROBE_DEFER warnings iio: light: bh1750: Resolve compiler warning and make code more readable spi: Add call to spi_slave_abort() function when spidev driver is released staging: rtl8192u: fix multiple memory leaks on error path staging: rtl8188eu: fix possible null dereference rtlwifi: prevent memory leak in rtl_usb_probe libertas: fix a potential NULL pointer dereference IB/iser: bound protection_sg size by data_sg size media: am437x-vpfe: Setting STD to current value is not an error media: i2c: ov2659: fix s_stream return value media: i2c: ov2659: Fix missing 720p register config media: ov6650: Fix stored frame format not in sync with hardware tools/power/cpupower: Fix initializer override in hsw_ext_cstates usb: renesas_usbhs: add suspend event support in gadget mode hwrng: omap3-rom - Call clk_disable_unprepare() on exit only if not idled regulator: max8907: Fix the usage of uninitialized variable in max8907_regulator_probe() media: flexcop-usb: fix NULL-ptr deref in flexcop_usb_transfer_init() media: cec-funcs.h: add status_req checks samples: pktgen: fix proc_cmd command result check logic mwifiex: pcie: Fix memory leak in mwifiex_pcie_init_evt_ring media: ti-vpe: vpe: fix a v4l2-compliance warning about invalid pixel format media: ti-vpe: vpe: fix a v4l2-compliance failure about frame sequence number media: ti-vpe: vpe: Make sure YUYV is set as default format extcon: sm5502: Reset registers during initialization x86/mm: Use the correct function type for native_set_fixmap() perf test: Report failure for mmap events perf report: Add warning when libunwind not compiled in usb: usbfs: Suppress problematic bind and unbind uevents. iio: adc: max1027: Reset the device at probe time Bluetooth: hci_core: fix init for HCI_USER_CHANNEL x86/mce: Lower throttling MCE messages' priority to warning drm/gma500: fix memory disclosures due to uninitialized bytes rtl8xxxu: fix RTL8723BU connection failure issue after warm reboot x86/ioapic: Prevent inconsistent state when moving an interrupt arm64: psci: Reduce the waiting time for cpu_psci_cpu_kill() libata: Ensure ata_port probe has completed before detach pinctrl: sh-pfc: sh7734: Fix duplicate TCLK1_B Bluetooth: Fix advertising duplicated flags bnx2x: Fix PF-VF communication over multi-cos queues. spi: img-spfi: fix potential double release ALSA: timer: Limit max amount of slave instances rtlwifi: fix memory leak in rtl92c_set_fw_rsvdpagepkt() perf probe: Fix to find range-only function instance perf probe: Fix to list probe event with correct line number perf probe: Walk function lines in lexical blocks perf probe: Fix to probe an inline function which has no entry pc perf probe: Fix to show ranges of variables in functions without entry_pc perf probe: Fix to show inlined function callsite without entry_pc perf probe: Fix to probe a function which has no entry pc perf probe: Skip overlapped location on searching variables perf probe: Return a better scope DIE if there is no best scope perf probe: Fix to show calling lines of inlined functions perf probe: Skip end-of-sequence and non statement lines perf probe: Filter out instances except for inlined subroutine and subprogram ath10k: fix get invalid tx rate for Mesh metric media: pvrusb2: Fix oops on tear-down when radio support is not present media: si470x-i2c: add missed operations in remove EDAC/ghes: Fix grain calculation spi: pxa2xx: Add missed security checks ASoC: rt5677: Mark reg RT5677_PWR_ANLG2 as volatile s390/disassembler: don't hide instruction addresses parport: load lowlevel driver if ports not found cpufreq: Register drivers only after CPU devices have been registered x86/crash: Add a forward declaration of struct kimage iwlwifi: mvm: fix unaligned read of rx_pkt_status spi: tegra20-slink: add missed clk_unprepare mmc: tmio: Add MMC_CAP_ERASE to allow erase/discard/trim requests btrfs: don't prematurely free work in end_workqueue_fn() btrfs: don't prematurely free work in run_ordered_work() spi: st-ssc4: add missed pm_runtime_disable x86/insn: Add some Intel instructions to the opcode map iwlwifi: check kasprintf() return value fbtft: Make sure string is NULL terminated crypto: sun4i-ss - Fix 64-bit size_t warnings on sun4i-ss-hash.c crypto: vmx - Avoid weird build failures libtraceevent: Fix memory leakage in copy_filter_type net: phy: initialise phydev speed and duplex sanely btrfs: don't prematurely free work in reada_start_machine_worker() Revert "mmc: sdhci: Fix incorrect switch to HS mode" usb: xhci: Fix build warning seen with CONFIG_PM=n btrfs: don't double lock the subvol_sem for rename exchange btrfs: do not call synchronize_srcu() in inode_tree_del btrfs: return error pointer from alloc_test_extent_buffer btrfs: abort transaction after failed inode updates in create_subvol Btrfs: fix removal logic of the tree mod log that leads to use-after-free issues af_packet: set defaule value for tmo fjes: fix missed check in fjes_acpi_add mod_devicetable: fix PHY module format net: hisilicon: Fix a BUG trigered by wrong bytes_compl net: nfc: nci: fix a possible sleep-in-atomic-context bug in nci_uart_tty_receive() net: qlogic: Fix error paths in ql_alloc_large_buffers() net: usb: lan78xx: Fix suspend/resume PHY register access error sctp: fully initialize v4 addr in some functions net: dst: Force 4-byte alignment of dst_metrics usbip: Fix error path of vhci_recv_ret_submit() USB: EHCI: Do not return -EPIPE when hub is disconnected platform/x86: hp-wmi: Make buffer for HPWMI_FEATURE2_QUERY 128 bytes staging: comedi: gsc_hpdi: check dma_alloc_coherent() return value ext4: fix ext4_empty_dir() for directories with holes ext4: check for directory entries too close to block end powerpc/irq: fix stack overflow verification mmc: sdhci-of-esdhc: fix P2020 errata handling perf probe: Fix to show function entry line as probe-able scsi: mpt3sas: Fix clear pending bit in ioctl status scsi: lpfc: Fix locking on mailbox command completion Input: atmel_mxt_ts - disable IRQ across suspend iommu/tegra-smmu: Fix page tables in > 4 GiB memory scsi: target: compare full CHAP_A Algorithm strings scsi: lpfc: Fix SLI3 hba in loop mode not discovering devices scsi: csiostor: Don't enable IRQs too early powerpc/pseries: Mark accumulate_stolen_time() as notrace powerpc/pseries: Don't fail hash page table insert for bolted mapping dma-debug: add a schedule point in debug_dma_dump_mappings() clocksource/drivers/asm9260: Add a check for of_clk_get powerpc/security/book3s64: Report L1TF status in sysfs powerpc/book3s64/hash: Add cond_resched to avoid soft lockup warning jbd2: Fix statistics for the number of logged blocks scsi: tracing: Fix handling of TRANSFER LENGTH == 0 for READ(6) and WRITE(6) scsi: lpfc: Fix duplicate unreg_rpi error in port offline flow clk: qcom: Allow constant ratio freq tables for rcg irqchip/irq-bcm7038-l1: Enable parent IRQ if necessary irqchip: ingenic: Error out if IRQ domain creation failed fs/quota: handle overflows of sysctl fs.quota.* and report as unsigned long scsi: lpfc: fix: Coverity: lpfc_cmpl_els_rsp(): Null pointer dereferences scsi: ufs: fix potential bug which ends in system hang powerpc/pseries/cmm: Implement release() function for sysfs device powerpc/security: Fix wrong message when RFI Flush is disable scsi: atari_scsi: sun3_scsi: Set sg_tablesize to 1 instead of SG_NONE clk: pxa: fix one of the pxa RTC clocks bcache: at least try to shrink 1 node in bch_mca_scan() HID: Improve Windows Precision Touchpad detection. ext4: work around deleting a file with i_nlink == 0 safely scsi: pm80xx: Fix for SATA device discovery scsi: scsi_debug: num_tgts must be >= 0 scsi: target: iscsi: Wait for all commands to finish before freeing a session gpio: mpc8xxx: Don't overwrite default irq_set_type callback scripts/kallsyms: fix definitely-lost memory leak cdrom: respect device capabilities during opening action perf regs: Make perf_reg_name() return "unknown" instead of NULL libfdt: define INT32_MAX and UINT32_MAX in libfdt_env.h s390/cpum_sf: Check for SDBT and SDB consistency ocfs2: fix passing zero to 'PTR_ERR' warning kernel: sysctl: make drop_caches write-only x86/mce: Fix possibly incorrect severity calculation on AMD net, sysctl: Fix compiler warning when only cBPF is present ALSA: hda - Downgrade error message for single-cmd fallback perf strbuf: Remove redundant va_end() in strbuf_addv() Make filldir[64]() verify the directory entry filename is valid filldir[64]: remove WARN_ON_ONCE() for bad directory entries netfilter: ebtables: compat: reject all padding in matches/watchers 6pack,mkiss: fix possible deadlock netfilter: bridge: make sure to pull arp header in br_nf_forward_arp() net: icmp: fix data-race in cmp_global_allow() hrtimer: Annotate lockless access to timer->state tty/serial: atmel: fix out of range clock divider handling pinctrl: baytrail: Really serialize all register accesses mmc: sdhci: Update the tuning failed messages to pr_debug level net: ena: fix napi handler misbehavior when the napi budget is zero vhost/vsock: accept only packets with the right dst_cid tcp/dccp: fix possible race __inet_lookup_established() tcp: do not send empty skb from tcp_write_xmit() gtp: fix wrong condition in gtp_genl_dump_pdp() gtp: avoid zero size hashtable Linux 4.9.208 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
commit
9759f952fd
174 changed files with 1110 additions and 417 deletions
2
Makefile
2
Makefile
|
@ -1,6 +1,6 @@
|
||||||
VERSION = 4
|
VERSION = 4
|
||||||
PATCHLEVEL = 9
|
PATCHLEVEL = 9
|
||||||
SUBLEVEL = 207
|
SUBLEVEL = 208
|
||||||
EXTRAVERSION =
|
EXTRAVERSION =
|
||||||
NAME = Roaring Lionus
|
NAME = Roaring Lionus
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
#ifndef _ARM_LIBFDT_ENV_H
|
#ifndef _ARM_LIBFDT_ENV_H
|
||||||
#define _ARM_LIBFDT_ENV_H
|
#define _ARM_LIBFDT_ENV_H
|
||||||
|
|
||||||
|
#include <linux/limits.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
#include <asm/byteorder.h>
|
#include <asm/byteorder.h>
|
||||||
|
|
||||||
#define INT_MAX ((int)(~0U>>1))
|
#define INT32_MAX S32_MAX
|
||||||
|
#define UINT32_MAX U32_MAX
|
||||||
|
|
||||||
typedef __be16 fdt16_t;
|
typedef __be16 fdt16_t;
|
||||||
typedef __be32 fdt32_t;
|
typedef __be32 fdt32_t;
|
||||||
|
|
|
@ -84,7 +84,8 @@ static void cpu_psci_cpu_die(unsigned int cpu)
|
||||||
|
|
||||||
static int cpu_psci_cpu_kill(unsigned int cpu)
|
static int cpu_psci_cpu_kill(unsigned int cpu)
|
||||||
{
|
{
|
||||||
int err, i;
|
int err;
|
||||||
|
unsigned long start, end;
|
||||||
|
|
||||||
if (!psci_ops.affinity_info)
|
if (!psci_ops.affinity_info)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -94,16 +95,18 @@ static int cpu_psci_cpu_kill(unsigned int cpu)
|
||||||
* while it is dying. So, try again a few times.
|
* while it is dying. So, try again a few times.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
for (i = 0; i < 10; i++) {
|
start = jiffies;
|
||||||
|
end = start + msecs_to_jiffies(100);
|
||||||
|
do {
|
||||||
err = psci_ops.affinity_info(cpu_logical_map(cpu), 0);
|
err = psci_ops.affinity_info(cpu_logical_map(cpu), 0);
|
||||||
if (err == PSCI_0_2_AFFINITY_LEVEL_OFF) {
|
if (err == PSCI_0_2_AFFINITY_LEVEL_OFF) {
|
||||||
pr_info("CPU%d killed.\n", cpu);
|
pr_info("CPU%d killed (polled %d ms)\n", cpu,
|
||||||
|
jiffies_to_msecs(jiffies - start));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
msleep(10);
|
usleep_range(100, 1000);
|
||||||
pr_info("Retrying again to check for CPU kill\n");
|
} while (time_before(jiffies, end));
|
||||||
}
|
|
||||||
|
|
||||||
pr_warn("CPU%d may not have shut down cleanly (AFFINITY_INFO reports %d)\n",
|
pr_warn("CPU%d may not have shut down cleanly (AFFINITY_INFO reports %d)\n",
|
||||||
cpu, err);
|
cpu, err);
|
||||||
|
|
|
@ -5,6 +5,8 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#define INT_MAX ((int)(~0U>>1))
|
#define INT_MAX ((int)(~0U>>1))
|
||||||
|
#define UINT32_MAX ((u32)~0U)
|
||||||
|
#define INT32_MAX ((s32)(UINT32_MAX >> 1))
|
||||||
|
|
||||||
#include "of.h"
|
#include "of.h"
|
||||||
|
|
||||||
|
|
|
@ -527,8 +527,6 @@ void __do_irq(struct pt_regs *regs)
|
||||||
|
|
||||||
trace_irq_entry(regs);
|
trace_irq_entry(regs);
|
||||||
|
|
||||||
check_stack_overflow();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Query the platform PIC for the interrupt & ack it.
|
* Query the platform PIC for the interrupt & ack it.
|
||||||
*
|
*
|
||||||
|
@ -560,6 +558,8 @@ void do_IRQ(struct pt_regs *regs)
|
||||||
irqtp = hardirq_ctx[raw_smp_processor_id()];
|
irqtp = hardirq_ctx[raw_smp_processor_id()];
|
||||||
sirqtp = softirq_ctx[raw_smp_processor_id()];
|
sirqtp = softirq_ctx[raw_smp_processor_id()];
|
||||||
|
|
||||||
|
check_stack_overflow();
|
||||||
|
|
||||||
/* Already there ? */
|
/* Already there ? */
|
||||||
if (unlikely(curtp == irqtp || curtp == sirqtp)) {
|
if (unlikely(curtp == irqtp || curtp == sirqtp)) {
|
||||||
__do_irq(regs);
|
__do_irq(regs);
|
||||||
|
|
|
@ -135,32 +135,33 @@ ssize_t cpu_show_meltdown(struct device *dev, struct device_attribute *attr, cha
|
||||||
|
|
||||||
thread_priv = security_ftr_enabled(SEC_FTR_L1D_THREAD_PRIV);
|
thread_priv = security_ftr_enabled(SEC_FTR_L1D_THREAD_PRIV);
|
||||||
|
|
||||||
if (rfi_flush || thread_priv) {
|
if (rfi_flush) {
|
||||||
struct seq_buf s;
|
struct seq_buf s;
|
||||||
seq_buf_init(&s, buf, PAGE_SIZE - 1);
|
seq_buf_init(&s, buf, PAGE_SIZE - 1);
|
||||||
|
|
||||||
seq_buf_printf(&s, "Mitigation: ");
|
seq_buf_printf(&s, "Mitigation: RFI Flush");
|
||||||
|
|
||||||
if (rfi_flush)
|
|
||||||
seq_buf_printf(&s, "RFI Flush");
|
|
||||||
|
|
||||||
if (rfi_flush && thread_priv)
|
|
||||||
seq_buf_printf(&s, ", ");
|
|
||||||
|
|
||||||
if (thread_priv)
|
if (thread_priv)
|
||||||
seq_buf_printf(&s, "L1D private per thread");
|
seq_buf_printf(&s, ", L1D private per thread");
|
||||||
|
|
||||||
seq_buf_printf(&s, "\n");
|
seq_buf_printf(&s, "\n");
|
||||||
|
|
||||||
return s.len;
|
return s.len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (thread_priv)
|
||||||
|
return sprintf(buf, "Vulnerable: L1D private per thread\n");
|
||||||
|
|
||||||
if (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) &&
|
if (!security_ftr_enabled(SEC_FTR_L1D_FLUSH_HV) &&
|
||||||
!security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR))
|
!security_ftr_enabled(SEC_FTR_L1D_FLUSH_PR))
|
||||||
return sprintf(buf, "Not affected\n");
|
return sprintf(buf, "Not affected\n");
|
||||||
|
|
||||||
return sprintf(buf, "Vulnerable\n");
|
return sprintf(buf, "Vulnerable\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ssize_t cpu_show_l1tf(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
|
{
|
||||||
|
return cpu_show_meltdown(dev, attr, buf);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr, char *buf)
|
ssize_t cpu_show_spectre_v1(struct device *dev, struct device_attribute *attr, char *buf)
|
||||||
|
|
|
@ -257,7 +257,7 @@ static u64 scan_dispatch_log(u64 stop_tb)
|
||||||
* Accumulate stolen time by scanning the dispatch trace log.
|
* Accumulate stolen time by scanning the dispatch trace log.
|
||||||
* Called on entry from user mode.
|
* Called on entry from user mode.
|
||||||
*/
|
*/
|
||||||
void accumulate_stolen_time(void)
|
void notrace accumulate_stolen_time(void)
|
||||||
{
|
{
|
||||||
u64 sst, ust;
|
u64 sst, ust;
|
||||||
u8 save_soft_enabled = local_paca->soft_enabled;
|
u8 save_soft_enabled = local_paca->soft_enabled;
|
||||||
|
|
|
@ -289,10 +289,18 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
|
||||||
ret = mmu_hash_ops.hpte_insert(hpteg, vpn, paddr, tprot,
|
ret = mmu_hash_ops.hpte_insert(hpteg, vpn, paddr, tprot,
|
||||||
HPTE_V_BOLTED, psize, psize,
|
HPTE_V_BOLTED, psize, psize,
|
||||||
ssize);
|
ssize);
|
||||||
|
if (ret == -1) {
|
||||||
|
/* Try to remove a non bolted entry */
|
||||||
|
ret = mmu_hash_ops.hpte_remove(hpteg);
|
||||||
|
if (ret != -1)
|
||||||
|
ret = mmu_hash_ops.hpte_insert(hpteg, vpn, paddr, tprot,
|
||||||
|
HPTE_V_BOLTED, psize, psize,
|
||||||
|
ssize);
|
||||||
|
}
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
cond_resched();
|
||||||
#ifdef CONFIG_DEBUG_PAGEALLOC
|
#ifdef CONFIG_DEBUG_PAGEALLOC
|
||||||
if (debug_pagealloc_enabled() &&
|
if (debug_pagealloc_enabled() &&
|
||||||
(paddr >> PAGE_SHIFT) < linear_map_hash_count)
|
(paddr >> PAGE_SHIFT) < linear_map_hash_count)
|
||||||
|
|
|
@ -391,6 +391,10 @@ static struct bus_type cmm_subsys = {
|
||||||
.dev_name = "cmm",
|
.dev_name = "cmm",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void cmm_release_device(struct device *dev)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cmm_sysfs_register - Register with sysfs
|
* cmm_sysfs_register - Register with sysfs
|
||||||
*
|
*
|
||||||
|
@ -406,6 +410,7 @@ static int cmm_sysfs_register(struct device *dev)
|
||||||
|
|
||||||
dev->id = 0;
|
dev->id = 0;
|
||||||
dev->bus = &cmm_subsys;
|
dev->bus = &cmm_subsys;
|
||||||
|
dev->release = cmm_release_device;
|
||||||
|
|
||||||
if ((rc = device_register(dev)))
|
if ((rc = device_register(dev)))
|
||||||
goto subsys_unregister;
|
goto subsys_unregister;
|
||||||
|
|
|
@ -1930,10 +1930,11 @@ static int print_insn(char *buffer, unsigned char *code, unsigned long addr)
|
||||||
ptr += sprintf(ptr, "%%c%i", value);
|
ptr += sprintf(ptr, "%%c%i", value);
|
||||||
else if (operand->flags & OPERAND_VR)
|
else if (operand->flags & OPERAND_VR)
|
||||||
ptr += sprintf(ptr, "%%v%i", value);
|
ptr += sprintf(ptr, "%%v%i", value);
|
||||||
else if (operand->flags & OPERAND_PCREL)
|
else if (operand->flags & OPERAND_PCREL) {
|
||||||
ptr += sprintf(ptr, "%lx", (signed int) value
|
void *pcrel = (void *)((int)value + addr);
|
||||||
+ addr);
|
|
||||||
else if (operand->flags & OPERAND_SIGNED)
|
ptr += sprintf(ptr, "%px", pcrel);
|
||||||
|
} else if (operand->flags & OPERAND_SIGNED)
|
||||||
ptr += sprintf(ptr, "%i", value);
|
ptr += sprintf(ptr, "%i", value);
|
||||||
else
|
else
|
||||||
ptr += sprintf(ptr, "%u", value);
|
ptr += sprintf(ptr, "%u", value);
|
||||||
|
@ -2005,7 +2006,7 @@ void show_code(struct pt_regs *regs)
|
||||||
else
|
else
|
||||||
*ptr++ = ' ';
|
*ptr++ = ' ';
|
||||||
addr = regs->psw.addr + start - 32;
|
addr = regs->psw.addr + start - 32;
|
||||||
ptr += sprintf(ptr, "%016lx: ", addr);
|
ptr += sprintf(ptr, "%px: ", (void *)addr);
|
||||||
if (start + opsize >= end)
|
if (start + opsize >= end)
|
||||||
break;
|
break;
|
||||||
for (i = 0; i < opsize; i++)
|
for (i = 0; i < opsize; i++)
|
||||||
|
@ -2033,7 +2034,7 @@ void print_fn_code(unsigned char *code, unsigned long len)
|
||||||
opsize = insn_length(*code);
|
opsize = insn_length(*code);
|
||||||
if (opsize > len)
|
if (opsize > len)
|
||||||
break;
|
break;
|
||||||
ptr += sprintf(ptr, "%p: ", code);
|
ptr += sprintf(ptr, "%px: ", code);
|
||||||
for (i = 0; i < opsize; i++)
|
for (i = 0; i < opsize; i++)
|
||||||
ptr += sprintf(ptr, "%02x", code[i]);
|
ptr += sprintf(ptr, "%02x", code[i]);
|
||||||
*ptr++ = '\t';
|
*ptr++ = '\t';
|
||||||
|
|
|
@ -185,7 +185,7 @@ static int realloc_sampling_buffer(struct sf_buffer *sfb,
|
||||||
unsigned long num_sdb, gfp_t gfp_flags)
|
unsigned long num_sdb, gfp_t gfp_flags)
|
||||||
{
|
{
|
||||||
int i, rc;
|
int i, rc;
|
||||||
unsigned long *new, *tail;
|
unsigned long *new, *tail, *tail_prev = NULL;
|
||||||
|
|
||||||
if (!sfb->sdbt || !sfb->tail)
|
if (!sfb->sdbt || !sfb->tail)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
@ -224,6 +224,7 @@ static int realloc_sampling_buffer(struct sf_buffer *sfb,
|
||||||
sfb->num_sdbt++;
|
sfb->num_sdbt++;
|
||||||
/* Link current page to tail of chain */
|
/* Link current page to tail of chain */
|
||||||
*tail = (unsigned long)(void *) new + 1;
|
*tail = (unsigned long)(void *) new + 1;
|
||||||
|
tail_prev = tail;
|
||||||
tail = new;
|
tail = new;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,10 +234,22 @@ static int realloc_sampling_buffer(struct sf_buffer *sfb,
|
||||||
* issue, a new realloc call (if required) might succeed.
|
* issue, a new realloc call (if required) might succeed.
|
||||||
*/
|
*/
|
||||||
rc = alloc_sample_data_block(tail, gfp_flags);
|
rc = alloc_sample_data_block(tail, gfp_flags);
|
||||||
if (rc)
|
if (rc) {
|
||||||
|
/* Undo last SDBT. An SDBT with no SDB at its first
|
||||||
|
* entry but with an SDBT entry instead can not be
|
||||||
|
* handled by the interrupt handler code.
|
||||||
|
* Avoid this situation.
|
||||||
|
*/
|
||||||
|
if (tail_prev) {
|
||||||
|
sfb->num_sdbt--;
|
||||||
|
free_page((unsigned long) new);
|
||||||
|
tail = tail_prev;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
sfb->num_sdb++;
|
sfb->num_sdb++;
|
||||||
tail++;
|
tail++;
|
||||||
|
tail_prev = new = NULL; /* Allocated at least one SBD */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Link sampling buffer to its origin */
|
/* Link sampling buffer to its origin */
|
||||||
|
|
|
@ -133,7 +133,7 @@ enum {
|
||||||
GPIO_FN_EX_WAIT1, GPIO_FN_SD1_DAT0_A, GPIO_FN_DREQ2, GPIO_FN_CAN1_TX_C,
|
GPIO_FN_EX_WAIT1, GPIO_FN_SD1_DAT0_A, GPIO_FN_DREQ2, GPIO_FN_CAN1_TX_C,
|
||||||
GPIO_FN_ET0_LINK_C, GPIO_FN_ET0_ETXD5_A,
|
GPIO_FN_ET0_LINK_C, GPIO_FN_ET0_ETXD5_A,
|
||||||
GPIO_FN_EX_WAIT0, GPIO_FN_TCLK1_B,
|
GPIO_FN_EX_WAIT0, GPIO_FN_TCLK1_B,
|
||||||
GPIO_FN_RD_WR, GPIO_FN_TCLK0,
|
GPIO_FN_RD_WR, GPIO_FN_TCLK0, GPIO_FN_CAN_CLK_B, GPIO_FN_ET0_ETXD4,
|
||||||
GPIO_FN_EX_CS5, GPIO_FN_SD1_CMD_A, GPIO_FN_ATADIR, GPIO_FN_QSSL_B,
|
GPIO_FN_EX_CS5, GPIO_FN_SD1_CMD_A, GPIO_FN_ATADIR, GPIO_FN_QSSL_B,
|
||||||
GPIO_FN_ET0_ETXD3_A,
|
GPIO_FN_ET0_ETXD3_A,
|
||||||
GPIO_FN_EX_CS4, GPIO_FN_SD1_WP_A, GPIO_FN_ATAWR, GPIO_FN_QMI_QIO1_B,
|
GPIO_FN_EX_CS4, GPIO_FN_SD1_WP_A, GPIO_FN_ATAWR, GPIO_FN_QMI_QIO1_B,
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
#ifndef _ASM_X86_CRASH_H
|
#ifndef _ASM_X86_CRASH_H
|
||||||
#define _ASM_X86_CRASH_H
|
#define _ASM_X86_CRASH_H
|
||||||
|
|
||||||
|
struct kimage;
|
||||||
|
|
||||||
int crash_load_segments(struct kimage *image);
|
int crash_load_segments(struct kimage *image);
|
||||||
int crash_copy_backup_region(struct kimage *image);
|
int crash_copy_backup_region(struct kimage *image);
|
||||||
int crash_setup_memmap_entries(struct kimage *image,
|
int crash_setup_memmap_entries(struct kimage *image,
|
||||||
|
|
|
@ -142,7 +142,7 @@ extern pte_t *kmap_pte;
|
||||||
extern pte_t *pkmap_page_table;
|
extern pte_t *pkmap_page_table;
|
||||||
|
|
||||||
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
|
void __native_set_fixmap(enum fixed_addresses idx, pte_t pte);
|
||||||
void native_set_fixmap(enum fixed_addresses idx,
|
void native_set_fixmap(unsigned /* enum fixed_addresses */ idx,
|
||||||
phys_addr_t phys, pgprot_t flags);
|
phys_addr_t phys, pgprot_t flags);
|
||||||
|
|
||||||
#ifndef CONFIG_PARAVIRT
|
#ifndef CONFIG_PARAVIRT
|
||||||
|
|
|
@ -1712,9 +1712,10 @@ static bool io_apic_level_ack_pending(struct mp_chip_data *data)
|
||||||
|
|
||||||
static inline bool ioapic_irqd_mask(struct irq_data *data)
|
static inline bool ioapic_irqd_mask(struct irq_data *data)
|
||||||
{
|
{
|
||||||
/* If we are moving the irq we need to mask it */
|
/* If we are moving the IRQ we need to mask it */
|
||||||
if (unlikely(irqd_is_setaffinity_pending(data))) {
|
if (unlikely(irqd_is_setaffinity_pending(data))) {
|
||||||
mask_ioapic_irq(data);
|
if (!irqd_irq_masked(data))
|
||||||
|
mask_ioapic_irq(data);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
@ -1751,7 +1752,9 @@ static inline void ioapic_irqd_unmask(struct irq_data *data, bool masked)
|
||||||
*/
|
*/
|
||||||
if (!io_apic_level_ack_pending(data->chip_data))
|
if (!io_apic_level_ack_pending(data->chip_data))
|
||||||
irq_move_masked_irq(data);
|
irq_move_masked_irq(data);
|
||||||
unmask_ioapic_irq(data);
|
/* If the IRQ is masked in the core, leave it: */
|
||||||
|
if (!irqd_irq_masked(data))
|
||||||
|
unmask_ioapic_irq(data);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -782,8 +782,8 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
|
||||||
if (quirk_no_way_out)
|
if (quirk_no_way_out)
|
||||||
quirk_no_way_out(i, m, regs);
|
quirk_no_way_out(i, m, regs);
|
||||||
|
|
||||||
|
m->bank = i;
|
||||||
if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
|
if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
|
||||||
m->bank = i;
|
|
||||||
mce_read_aux(m, i);
|
mce_read_aux(m, i);
|
||||||
*msg = tmp;
|
*msg = tmp;
|
||||||
return 1;
|
return 1;
|
||||||
|
|
|
@ -190,7 +190,7 @@ static int therm_throt_process(bool new_event, int event, int level)
|
||||||
/* if we just entered the thermal event */
|
/* if we just entered the thermal event */
|
||||||
if (new_event) {
|
if (new_event) {
|
||||||
if (event == THERMAL_THROTTLING_EVENT)
|
if (event == THERMAL_THROTTLING_EVENT)
|
||||||
pr_crit("CPU%d: %s temperature above threshold, cpu clock throttled (total events = %lu)\n",
|
pr_warn("CPU%d: %s temperature above threshold, cpu clock throttled (total events = %lu)\n",
|
||||||
this_cpu,
|
this_cpu,
|
||||||
level == CORE_LEVEL ? "Core" : "Package",
|
level == CORE_LEVEL ? "Core" : "Package",
|
||||||
state->count);
|
state->count);
|
||||||
|
|
|
@ -333,7 +333,7 @@ AVXcode: 1
|
||||||
06: CLTS
|
06: CLTS
|
||||||
07: SYSRET (o64)
|
07: SYSRET (o64)
|
||||||
08: INVD
|
08: INVD
|
||||||
09: WBINVD
|
09: WBINVD | WBNOINVD (F3)
|
||||||
0a:
|
0a:
|
||||||
0b: UD2 (1B)
|
0b: UD2 (1B)
|
||||||
0c:
|
0c:
|
||||||
|
@ -364,7 +364,7 @@ AVXcode: 1
|
||||||
# a ModR/M byte.
|
# a ModR/M byte.
|
||||||
1a: BNDCL Gv,Ev (F3) | BNDCU Gv,Ev (F2) | BNDMOV Gv,Ev (66) | BNDLDX Gv,Ev
|
1a: BNDCL Gv,Ev (F3) | BNDCU Gv,Ev (F2) | BNDMOV Gv,Ev (66) | BNDLDX Gv,Ev
|
||||||
1b: BNDCN Gv,Ev (F2) | BNDMOV Ev,Gv (66) | BNDMK Gv,Ev (F3) | BNDSTX Ev,Gv
|
1b: BNDCN Gv,Ev (F2) | BNDMOV Ev,Gv (66) | BNDMK Gv,Ev (F3) | BNDSTX Ev,Gv
|
||||||
1c:
|
1c: Grp20 (1A),(1C)
|
||||||
1d:
|
1d:
|
||||||
1e:
|
1e:
|
||||||
1f: NOP Ev
|
1f: NOP Ev
|
||||||
|
@ -792,6 +792,8 @@ f3: Grp17 (1A)
|
||||||
f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v)
|
f5: BZHI Gy,Ey,By (v) | PEXT Gy,By,Ey (F3),(v) | PDEP Gy,By,Ey (F2),(v)
|
||||||
f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v)
|
f6: ADCX Gy,Ey (66) | ADOX Gy,Ey (F3) | MULX By,Gy,rDX,Ey (F2),(v)
|
||||||
f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
|
f7: BEXTR Gy,Ey,By (v) | SHLX Gy,Ey,By (66),(v) | SARX Gy,Ey,By (F3),(v) | SHRX Gy,Ey,By (F2),(v)
|
||||||
|
f8: MOVDIR64B Gv,Mdqq (66) | ENQCMD Gv,Mdqq (F2) | ENQCMDS Gv,Mdqq (F3)
|
||||||
|
f9: MOVDIRI My,Gy
|
||||||
EndTable
|
EndTable
|
||||||
|
|
||||||
Table: 3-byte opcode 2 (0x0f 0x3a)
|
Table: 3-byte opcode 2 (0x0f 0x3a)
|
||||||
|
@ -943,9 +945,9 @@ GrpTable: Grp6
|
||||||
EndTable
|
EndTable
|
||||||
|
|
||||||
GrpTable: Grp7
|
GrpTable: Grp7
|
||||||
0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B)
|
0: SGDT Ms | VMCALL (001),(11B) | VMLAUNCH (010),(11B) | VMRESUME (011),(11B) | VMXOFF (100),(11B) | PCONFIG (101),(11B) | ENCLV (000),(11B)
|
||||||
1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B)
|
1: SIDT Ms | MONITOR (000),(11B) | MWAIT (001),(11B) | CLAC (010),(11B) | STAC (011),(11B) | ENCLS (111),(11B)
|
||||||
2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B)
|
2: LGDT Ms | XGETBV (000),(11B) | XSETBV (001),(11B) | VMFUNC (100),(11B) | XEND (101)(11B) | XTEST (110)(11B) | ENCLU (111),(11B)
|
||||||
3: LIDT Ms
|
3: LIDT Ms
|
||||||
4: SMSW Mw/Rv
|
4: SMSW Mw/Rv
|
||||||
5: rdpkru (110),(11B) | wrpkru (111),(11B)
|
5: rdpkru (110),(11B) | wrpkru (111),(11B)
|
||||||
|
@ -1011,7 +1013,7 @@ GrpTable: Grp15
|
||||||
3: vstmxcsr Md (v1) | WRGSBASE Ry (F3),(11B)
|
3: vstmxcsr Md (v1) | WRGSBASE Ry (F3),(11B)
|
||||||
4: XSAVE
|
4: XSAVE
|
||||||
5: XRSTOR | lfence (11B)
|
5: XRSTOR | lfence (11B)
|
||||||
6: XSAVEOPT | clwb (66) | mfence (11B)
|
6: XSAVEOPT | clwb (66) | mfence (11B) | TPAUSE Rd (66),(11B) | UMONITOR Rv (F3),(11B) | UMWAIT Rd (F2),(11B)
|
||||||
7: clflush | clflushopt (66) | sfence (11B)
|
7: clflush | clflushopt (66) | sfence (11B)
|
||||||
EndTable
|
EndTable
|
||||||
|
|
||||||
|
@ -1042,6 +1044,10 @@ GrpTable: Grp19
|
||||||
6: vscatterpf1qps/d Wx (66),(ev)
|
6: vscatterpf1qps/d Wx (66),(ev)
|
||||||
EndTable
|
EndTable
|
||||||
|
|
||||||
|
GrpTable: Grp20
|
||||||
|
0: cldemote Mb
|
||||||
|
EndTable
|
||||||
|
|
||||||
# AMD's Prefetch Group
|
# AMD's Prefetch Group
|
||||||
GrpTable: GrpP
|
GrpTable: GrpP
|
||||||
0: PREFETCH
|
0: PREFETCH
|
||||||
|
|
|
@ -544,8 +544,8 @@ void __native_set_fixmap(enum fixed_addresses idx, pte_t pte)
|
||||||
fixmaps_set++;
|
fixmaps_set++;
|
||||||
}
|
}
|
||||||
|
|
||||||
void native_set_fixmap(enum fixed_addresses idx, phys_addr_t phys,
|
void native_set_fixmap(unsigned /* enum fixed_addresses */ idx,
|
||||||
pgprot_t flags)
|
phys_addr_t phys, pgprot_t flags)
|
||||||
{
|
{
|
||||||
__native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags));
|
__native_set_fixmap(idx, pfn_pte(phys >> PAGE_SHIFT, flags));
|
||||||
}
|
}
|
||||||
|
|
|
@ -6550,6 +6550,9 @@ void ata_host_detach(struct ata_host *host)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
/* Ensure ata_port probe has completed */
|
||||||
|
async_synchronize_full();
|
||||||
|
|
||||||
for (i = 0; i < host->n_ports; i++)
|
for (i = 0; i < host->n_ports; i++)
|
||||||
ata_port_detach(host->ports[i]);
|
ata_port_detach(host->ports[i]);
|
||||||
|
|
||||||
|
|
|
@ -998,6 +998,12 @@ static void cdrom_count_tracks(struct cdrom_device_info *cdi, tracktype *tracks)
|
||||||
tracks->xa = 0;
|
tracks->xa = 0;
|
||||||
tracks->error = 0;
|
tracks->error = 0;
|
||||||
cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
|
cd_dbg(CD_COUNT_TRACKS, "entering cdrom_count_tracks\n");
|
||||||
|
|
||||||
|
if (!CDROM_CAN(CDC_PLAY_AUDIO)) {
|
||||||
|
tracks->error = CDS_NO_INFO;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/* Grab the TOC header so we can see how many tracks there are */
|
/* Grab the TOC header so we can see how many tracks there are */
|
||||||
ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
|
ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCHDR, &header);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
@ -1164,7 +1170,8 @@ int cdrom_open(struct cdrom_device_info *cdi, struct block_device *bdev,
|
||||||
ret = open_for_data(cdi);
|
ret = open_for_data(cdi);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err;
|
goto err;
|
||||||
cdrom_mmc3_profile(cdi);
|
if (CDROM_CAN(CDC_GENERIC_PACKET))
|
||||||
|
cdrom_mmc3_profile(cdi);
|
||||||
if (mode & FMODE_WRITE) {
|
if (mode & FMODE_WRITE) {
|
||||||
ret = -EROFS;
|
ret = -EROFS;
|
||||||
if (cdrom_open_write(cdi))
|
if (cdrom_open_write(cdi))
|
||||||
|
@ -2873,6 +2880,9 @@ int cdrom_get_last_written(struct cdrom_device_info *cdi, long *last_written)
|
||||||
it doesn't give enough information or fails. then we return
|
it doesn't give enough information or fails. then we return
|
||||||
the toc contents. */
|
the toc contents. */
|
||||||
use_toc:
|
use_toc:
|
||||||
|
if (!CDROM_CAN(CDC_PLAY_AUDIO))
|
||||||
|
return -ENOSYS;
|
||||||
|
|
||||||
toc.cdte_format = CDROM_MSF;
|
toc.cdte_format = CDROM_MSF;
|
||||||
toc.cdte_track = CDROM_LEADOUT;
|
toc.cdte_track = CDROM_LEADOUT;
|
||||||
if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
|
if ((ret = cdi->ops->audio_ioctl(cdi, CDROMREADTOCENTRY, &toc)))
|
||||||
|
|
|
@ -114,7 +114,8 @@ static int omap3_rom_rng_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
cancel_delayed_work_sync(&idle_work);
|
cancel_delayed_work_sync(&idle_work);
|
||||||
hwrng_unregister(&omap3_rom_rng_ops);
|
hwrng_unregister(&omap3_rom_rng_ops);
|
||||||
clk_disable_unprepare(rng_clk);
|
if (!rng_idle)
|
||||||
|
clk_disable_unprepare(rng_clk);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -362,6 +362,7 @@ struct dummy_clk {
|
||||||
};
|
};
|
||||||
static struct dummy_clk dummy_clks[] __initdata = {
|
static struct dummy_clk dummy_clks[] __initdata = {
|
||||||
DUMMY_CLK(NULL, "pxa27x-gpio", "osc_32_768khz"),
|
DUMMY_CLK(NULL, "pxa27x-gpio", "osc_32_768khz"),
|
||||||
|
DUMMY_CLK(NULL, "pxa-rtc", "osc_32_768khz"),
|
||||||
DUMMY_CLK(NULL, "sa1100-rtc", "osc_32_768khz"),
|
DUMMY_CLK(NULL, "sa1100-rtc", "osc_32_768khz"),
|
||||||
DUMMY_CLK("UARTCLK", "pxa2xx-ir", "STUART"),
|
DUMMY_CLK("UARTCLK", "pxa2xx-ir", "STUART"),
|
||||||
};
|
};
|
||||||
|
|
|
@ -196,6 +196,8 @@ static int _freq_tbl_determine_rate(struct clk_hw *hw,
|
||||||
p = clk_hw_get_parent_by_index(hw, index);
|
p = clk_hw_get_parent_by_index(hw, index);
|
||||||
if (clk_flags & CLK_SET_RATE_PARENT) {
|
if (clk_flags & CLK_SET_RATE_PARENT) {
|
||||||
if (f->pre_div) {
|
if (f->pre_div) {
|
||||||
|
if (!rate)
|
||||||
|
rate = req->rate;
|
||||||
rate /= 2;
|
rate /= 2;
|
||||||
rate *= f->pre_div + 1;
|
rate *= f->pre_div + 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,9 @@ struct freq_tbl *qcom_find_freq(const struct freq_tbl *f, unsigned long rate)
|
||||||
if (!f)
|
if (!f)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
|
if (!f->freq)
|
||||||
|
return f;
|
||||||
|
|
||||||
for (; f->freq; f++)
|
for (; f->freq; f++)
|
||||||
if (rate <= f->freq)
|
if (rate <= f->freq)
|
||||||
return f;
|
return f;
|
||||||
|
|
|
@ -198,6 +198,10 @@ static int __init asm9260_timer_init(struct device_node *np)
|
||||||
}
|
}
|
||||||
|
|
||||||
clk = of_clk_get(np, 0);
|
clk = of_clk_get(np, 0);
|
||||||
|
if (IS_ERR(clk)) {
|
||||||
|
pr_err("Failed to get clk!\n");
|
||||||
|
return PTR_ERR(clk);
|
||||||
|
}
|
||||||
|
|
||||||
ret = clk_prepare_enable(clk);
|
ret = clk_prepare_enable(clk);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -2565,6 +2565,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
|
||||||
if (cpufreq_disabled())
|
if (cpufreq_disabled())
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The cpufreq core depends heavily on the availability of device
|
||||||
|
* structure, make sure they are available before proceeding further.
|
||||||
|
*/
|
||||||
|
if (!get_cpu_device(0))
|
||||||
|
return -EPROBE_DEFER;
|
||||||
|
|
||||||
if (!driver_data || !driver_data->verify || !driver_data->init ||
|
if (!driver_data || !driver_data->verify || !driver_data->init ||
|
||||||
!(driver_data->setpolicy || driver_data->target_index ||
|
!(driver_data->setpolicy || driver_data->target_index ||
|
||||||
driver_data->target) ||
|
driver_data->target) ||
|
||||||
|
|
|
@ -286,8 +286,8 @@ static int sun4i_hash(struct ahash_request *areq)
|
||||||
*/
|
*/
|
||||||
while (op->len < 64 && i < end) {
|
while (op->len < 64 && i < end) {
|
||||||
/* how many bytes we can read from current SG */
|
/* how many bytes we can read from current SG */
|
||||||
in_r = min3(mi.length - in_i, end - i,
|
in_r = min(end - i, 64 - op->len);
|
||||||
64 - op->len);
|
in_r = min_t(size_t, mi.length - in_i, in_r);
|
||||||
memcpy(op->buf + op->len, mi.addr + in_i, in_r);
|
memcpy(op->buf + op->len, mi.addr + in_i, in_r);
|
||||||
op->len += in_r;
|
op->len += in_r;
|
||||||
i += in_r;
|
i += in_r;
|
||||||
|
@ -307,8 +307,8 @@ static int sun4i_hash(struct ahash_request *areq)
|
||||||
}
|
}
|
||||||
if (mi.length - in_i > 3 && i < end) {
|
if (mi.length - in_i > 3 && i < end) {
|
||||||
/* how many bytes we can read from current SG */
|
/* how many bytes we can read from current SG */
|
||||||
in_r = min3(mi.length - in_i, areq->nbytes - i,
|
in_r = min_t(size_t, mi.length - in_i, areq->nbytes - i);
|
||||||
((mi.length - in_i) / 4) * 4);
|
in_r = min_t(size_t, ((mi.length - in_i) / 4) * 4, in_r);
|
||||||
/* how many bytes we can write in the device*/
|
/* how many bytes we can write in the device*/
|
||||||
todo = min3((u32)(end - i) / 4, rx_cnt, (u32)in_r / 4);
|
todo = min3((u32)(end - i) / 4, rx_cnt, (u32)in_r / 4);
|
||||||
writesl(ss->base + SS_RXFIFO, mi.addr + in_i, todo);
|
writesl(ss->base + SS_RXFIFO, mi.addr + in_i, todo);
|
||||||
|
@ -334,8 +334,8 @@ static int sun4i_hash(struct ahash_request *areq)
|
||||||
if ((areq->nbytes - i) < 64) {
|
if ((areq->nbytes - i) < 64) {
|
||||||
while (i < areq->nbytes && in_i < mi.length && op->len < 64) {
|
while (i < areq->nbytes && in_i < mi.length && op->len < 64) {
|
||||||
/* how many bytes we can read from current SG */
|
/* how many bytes we can read from current SG */
|
||||||
in_r = min3(mi.length - in_i, areq->nbytes - i,
|
in_r = min(areq->nbytes - i, 64 - op->len);
|
||||||
64 - op->len);
|
in_r = min_t(size_t, mi.length - in_i, in_r);
|
||||||
memcpy(op->buf + op->len, mi.addr + in_i, in_r);
|
memcpy(op->buf + op->len, mi.addr + in_i, in_r);
|
||||||
op->len += in_r;
|
op->len += in_r;
|
||||||
i += in_r;
|
i += in_r;
|
||||||
|
|
|
@ -2,13 +2,13 @@ obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o
|
||||||
vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o
|
vmx-crypto-objs := vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y)
|
ifeq ($(CONFIG_CPU_LITTLE_ENDIAN),y)
|
||||||
TARGET := linux-ppc64le
|
override flavour := linux-ppc64le
|
||||||
else
|
else
|
||||||
TARGET := linux-ppc64
|
override flavour := linux-ppc64
|
||||||
endif
|
endif
|
||||||
|
|
||||||
quiet_cmd_perl = PERL $@
|
quiet_cmd_perl = PERL $@
|
||||||
cmd_perl = $(PERL) $(<) $(TARGET) > $(@)
|
cmd_perl = $(PERL) $(<) $(flavour) > $(@)
|
||||||
|
|
||||||
$(src)/aesp8-ppc.S: $(src)/aesp8-ppc.pl
|
$(src)/aesp8-ppc.S: $(src)/aesp8-ppc.pl
|
||||||
$(call cmd,perl)
|
$(call cmd,perl)
|
||||||
|
|
|
@ -189,6 +189,7 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
|
||||||
/* Cleans the error report buffer */
|
/* Cleans the error report buffer */
|
||||||
memset(e, 0, sizeof (*e));
|
memset(e, 0, sizeof (*e));
|
||||||
e->error_count = 1;
|
e->error_count = 1;
|
||||||
|
e->grain = 1;
|
||||||
strcpy(e->label, "unknown label");
|
strcpy(e->label, "unknown label");
|
||||||
e->msg = pvt->msg;
|
e->msg = pvt->msg;
|
||||||
e->other_detail = pvt->other_detail;
|
e->other_detail = pvt->other_detail;
|
||||||
|
@ -284,7 +285,7 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
|
||||||
|
|
||||||
/* Error grain */
|
/* Error grain */
|
||||||
if (mem_err->validation_bits & CPER_MEM_VALID_PA_MASK)
|
if (mem_err->validation_bits & CPER_MEM_VALID_PA_MASK)
|
||||||
e->grain = ~(mem_err->physical_addr_mask & ~PAGE_MASK);
|
e->grain = ~mem_err->physical_addr_mask + 1;
|
||||||
|
|
||||||
/* Memory error location, mapped on e->location */
|
/* Memory error location, mapped on e->location */
|
||||||
p = e->location;
|
p = e->location;
|
||||||
|
@ -391,8 +392,13 @@ void ghes_edac_report_mem_error(struct ghes *ghes, int sev,
|
||||||
if (p > pvt->other_detail)
|
if (p > pvt->other_detail)
|
||||||
*(p - 1) = '\0';
|
*(p - 1) = '\0';
|
||||||
|
|
||||||
|
/* Sanity-check driver-supplied grain value. */
|
||||||
|
if (WARN_ON_ONCE(!e->grain))
|
||||||
|
e->grain = 1;
|
||||||
|
|
||||||
|
grain_bits = fls_long(e->grain - 1);
|
||||||
|
|
||||||
/* Generate the trace event */
|
/* Generate the trace event */
|
||||||
grain_bits = fls_long(e->grain);
|
|
||||||
snprintf(pvt->detail_location, sizeof(pvt->detail_location),
|
snprintf(pvt->detail_location, sizeof(pvt->detail_location),
|
||||||
"APEI location: %s %s", e->location, e->other_detail);
|
"APEI location: %s %s", e->location, e->other_detail);
|
||||||
trace_mc_event(type, e->msg, e->label, e->error_count,
|
trace_mc_event(type, e->msg, e->label, e->error_count,
|
||||||
|
|
|
@ -69,6 +69,10 @@ struct sm5502_muic_info {
|
||||||
/* Default value of SM5502 register to bring up MUIC device. */
|
/* Default value of SM5502 register to bring up MUIC device. */
|
||||||
static struct reg_data sm5502_reg_data[] = {
|
static struct reg_data sm5502_reg_data[] = {
|
||||||
{
|
{
|
||||||
|
.reg = SM5502_REG_RESET,
|
||||||
|
.val = SM5502_REG_RESET_MASK,
|
||||||
|
.invert = true,
|
||||||
|
}, {
|
||||||
.reg = SM5502_REG_CONTROL,
|
.reg = SM5502_REG_CONTROL,
|
||||||
.val = SM5502_REG_CONTROL_MASK_INT_MASK,
|
.val = SM5502_REG_CONTROL_MASK_INT_MASK,
|
||||||
.invert = false,
|
.invert = false,
|
||||||
|
|
|
@ -241,6 +241,8 @@ enum sm5502_reg {
|
||||||
#define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
|
#define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
|
||||||
| (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
|
| (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
|
||||||
|
|
||||||
|
#define SM5502_REG_RESET_MASK (0x1)
|
||||||
|
|
||||||
/* SM5502 Interrupts */
|
/* SM5502 Interrupts */
|
||||||
enum sm5502_irq {
|
enum sm5502_irq {
|
||||||
/* INT1 */
|
/* INT1 */
|
||||||
|
|
|
@ -337,7 +337,8 @@ static int mpc8xxx_probe(struct platform_device *pdev)
|
||||||
* It's assumed that only a single type of gpio controller is available
|
* It's assumed that only a single type of gpio controller is available
|
||||||
* on the current machine, so overwriting global data is fine.
|
* on the current machine, so overwriting global data is fine.
|
||||||
*/
|
*/
|
||||||
mpc8xxx_irq_chip.irq_set_type = devtype->irq_set_type;
|
if (devtype->irq_set_type)
|
||||||
|
mpc8xxx_irq_chip.irq_set_type = devtype->irq_set_type;
|
||||||
|
|
||||||
if (devtype->gpio_dir_out)
|
if (devtype->gpio_dir_out)
|
||||||
gc->direction_output = devtype->gpio_dir_out;
|
gc->direction_output = devtype->gpio_dir_out;
|
||||||
|
|
|
@ -725,7 +725,9 @@ static int anx78xx_init_pdata(struct anx78xx *anx78xx)
|
||||||
/* 1.0V digital core power regulator */
|
/* 1.0V digital core power regulator */
|
||||||
pdata->dvdd10 = devm_regulator_get(dev, "dvdd10");
|
pdata->dvdd10 = devm_regulator_get(dev, "dvdd10");
|
||||||
if (IS_ERR(pdata->dvdd10)) {
|
if (IS_ERR(pdata->dvdd10)) {
|
||||||
DRM_ERROR("DVDD10 regulator not found\n");
|
if (PTR_ERR(pdata->dvdd10) != -EPROBE_DEFER)
|
||||||
|
DRM_ERROR("DVDD10 regulator not found\n");
|
||||||
|
|
||||||
return PTR_ERR(pdata->dvdd10);
|
return PTR_ERR(pdata->dvdd10);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1344,7 +1346,9 @@ static int anx78xx_i2c_probe(struct i2c_client *client,
|
||||||
|
|
||||||
err = anx78xx_init_pdata(anx78xx);
|
err = anx78xx_init_pdata(anx78xx);
|
||||||
if (err) {
|
if (err) {
|
||||||
DRM_ERROR("Failed to initialize pdata: %d\n", err);
|
if (err != -EPROBE_DEFER)
|
||||||
|
DRM_ERROR("Failed to initialize pdata: %d\n", err);
|
||||||
|
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,7 @@ static bool mrst_sdvo_find_best_pll(const struct gma_limit_t *limit,
|
||||||
s32 freq_error, min_error = 100000;
|
s32 freq_error, min_error = 100000;
|
||||||
|
|
||||||
memset(best_clock, 0, sizeof(*best_clock));
|
memset(best_clock, 0, sizeof(*best_clock));
|
||||||
|
memset(&clock, 0, sizeof(clock));
|
||||||
|
|
||||||
for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) {
|
for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) {
|
||||||
for (clock.n = limit->n.min; clock.n <= limit->n.max;
|
for (clock.n = limit->n.min; clock.n <= limit->n.max;
|
||||||
|
@ -195,6 +196,7 @@ static bool mrst_lvds_find_best_pll(const struct gma_limit_t *limit,
|
||||||
int err = target;
|
int err = target;
|
||||||
|
|
||||||
memset(best_clock, 0, sizeof(*best_clock));
|
memset(best_clock, 0, sizeof(*best_clock));
|
||||||
|
memset(&clock, 0, sizeof(clock));
|
||||||
|
|
||||||
for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) {
|
for (clock.m = limit->m.min; clock.m <= limit->m.max; clock.m++) {
|
||||||
for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max;
|
for (clock.p1 = limit->p1.min; clock.p1 <= limit->p1.max;
|
||||||
|
|
|
@ -761,6 +761,10 @@ static void hid_scan_feature_usage(struct hid_parser *parser, u32 usage)
|
||||||
if (usage == 0xff0000c5 && parser->global.report_count == 256 &&
|
if (usage == 0xff0000c5 && parser->global.report_count == 256 &&
|
||||||
parser->global.report_size == 8)
|
parser->global.report_size == 8)
|
||||||
parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
|
parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
|
||||||
|
|
||||||
|
if (usage == 0xff0000c6 && parser->global.report_count == 1 &&
|
||||||
|
parser->global.report_size == 8)
|
||||||
|
parser->scan_flags |= HID_SCAN_FLAG_MT_WIN_8;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void hid_scan_collection(struct hid_parser *parser, unsigned type)
|
static void hid_scan_collection(struct hid_parser *parser, unsigned type)
|
||||||
|
|
|
@ -471,6 +471,14 @@ static int max1027_probe(struct spi_device *spi)
|
||||||
goto fail_dev_register;
|
goto fail_dev_register;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Internal reset */
|
||||||
|
st->reg = MAX1027_RST_REG;
|
||||||
|
ret = spi_write(st->spi, &st->reg, 1);
|
||||||
|
if (ret < 0) {
|
||||||
|
dev_err(&indio_dev->dev, "Failed to reset the ADC\n");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Disable averaging */
|
/* Disable averaging */
|
||||||
st->reg = MAX1027_AVG_REG;
|
st->reg = MAX1027_AVG_REG;
|
||||||
ret = spi_write(st->spi, &st->reg, 1);
|
ret = spi_write(st->spi, &st->reg, 1);
|
||||||
|
|
|
@ -62,9 +62,9 @@ struct bh1750_chip_info {
|
||||||
|
|
||||||
u16 int_time_low_mask;
|
u16 int_time_low_mask;
|
||||||
u16 int_time_high_mask;
|
u16 int_time_high_mask;
|
||||||
}
|
};
|
||||||
|
|
||||||
static const bh1750_chip_info_tbl[] = {
|
static const struct bh1750_chip_info bh1750_chip_info_tbl[] = {
|
||||||
[BH1710] = { 140, 1022, 300, 400, 250000000, 2, 0x001F, 0x03E0 },
|
[BH1710] = { 140, 1022, 300, 400, 250000000, 2, 0x001F, 0x03E0 },
|
||||||
[BH1721] = { 140, 1020, 300, 400, 250000000, 2, 0x0010, 0x03E0 },
|
[BH1721] = { 140, 1020, 300, 400, 250000000, 2, 0x0010, 0x03E0 },
|
||||||
[BH1750] = { 31, 254, 69, 1740, 57500000, 1, 0x001F, 0x00E0 },
|
[BH1750] = { 31, 254, 69, 1740, 57500000, 1, 0x001F, 0x00E0 },
|
||||||
|
|
|
@ -649,6 +649,7 @@ iscsi_iser_session_create(struct iscsi_endpoint *ep,
|
||||||
if (ib_conn->pi_support) {
|
if (ib_conn->pi_support) {
|
||||||
u32 sig_caps = ib_conn->device->ib_device->attrs.sig_prot_cap;
|
u32 sig_caps = ib_conn->device->ib_device->attrs.sig_prot_cap;
|
||||||
|
|
||||||
|
shost->sg_prot_tablesize = shost->sg_tablesize;
|
||||||
scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps));
|
scsi_host_set_prot(shost, iser_dif_prot_caps(sig_caps));
|
||||||
scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP |
|
scsi_host_set_guard(shost, SHOST_DIX_GUARD_IP |
|
||||||
SHOST_DIX_GUARD_CRC);
|
SHOST_DIX_GUARD_CRC);
|
||||||
|
|
|
@ -3206,6 +3206,8 @@ static int __maybe_unused mxt_suspend(struct device *dev)
|
||||||
|
|
||||||
mutex_unlock(&input_dev->mutex);
|
mutex_unlock(&input_dev->mutex);
|
||||||
|
|
||||||
|
disable_irq(data->irq);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3218,6 +3220,8 @@ static int __maybe_unused mxt_resume(struct device *dev)
|
||||||
if (!input_dev)
|
if (!input_dev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
enable_irq(data->irq);
|
||||||
|
|
||||||
mutex_lock(&input_dev->mutex);
|
mutex_lock(&input_dev->mutex);
|
||||||
|
|
||||||
if (input_dev->users)
|
if (input_dev->users)
|
||||||
|
|
|
@ -153,9 +153,9 @@ static bool smmu_dma_addr_valid(struct tegra_smmu *smmu, dma_addr_t addr)
|
||||||
return (addr & smmu->pfn_mask) == addr;
|
return (addr & smmu->pfn_mask) == addr;
|
||||||
}
|
}
|
||||||
|
|
||||||
static dma_addr_t smmu_pde_to_dma(u32 pde)
|
static dma_addr_t smmu_pde_to_dma(struct tegra_smmu *smmu, u32 pde)
|
||||||
{
|
{
|
||||||
return pde << 12;
|
return (dma_addr_t)(pde & smmu->pfn_mask) << 12;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void smmu_flush_ptc_all(struct tegra_smmu *smmu)
|
static void smmu_flush_ptc_all(struct tegra_smmu *smmu)
|
||||||
|
@ -540,6 +540,7 @@ static u32 *tegra_smmu_pte_lookup(struct tegra_smmu_as *as, unsigned long iova,
|
||||||
dma_addr_t *dmap)
|
dma_addr_t *dmap)
|
||||||
{
|
{
|
||||||
unsigned int pd_index = iova_pd_index(iova);
|
unsigned int pd_index = iova_pd_index(iova);
|
||||||
|
struct tegra_smmu *smmu = as->smmu;
|
||||||
struct page *pt_page;
|
struct page *pt_page;
|
||||||
u32 *pd;
|
u32 *pd;
|
||||||
|
|
||||||
|
@ -548,7 +549,7 @@ static u32 *tegra_smmu_pte_lookup(struct tegra_smmu_as *as, unsigned long iova,
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
pd = page_address(as->pd);
|
pd = page_address(as->pd);
|
||||||
*dmap = smmu_pde_to_dma(pd[pd_index]);
|
*dmap = smmu_pde_to_dma(smmu, pd[pd_index]);
|
||||||
|
|
||||||
return tegra_smmu_pte_offset(pt_page, iova);
|
return tegra_smmu_pte_offset(pt_page, iova);
|
||||||
}
|
}
|
||||||
|
@ -590,7 +591,7 @@ static u32 *as_get_pte(struct tegra_smmu_as *as, dma_addr_t iova,
|
||||||
} else {
|
} else {
|
||||||
u32 *pd = page_address(as->pd);
|
u32 *pd = page_address(as->pd);
|
||||||
|
|
||||||
*dmap = smmu_pde_to_dma(pd[pde]);
|
*dmap = smmu_pde_to_dma(smmu, pd[pde]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return tegra_smmu_pte_offset(as->pts[pde], iova);
|
return tegra_smmu_pte_offset(as->pts[pde], iova);
|
||||||
|
@ -615,7 +616,7 @@ static void tegra_smmu_pte_put_use(struct tegra_smmu_as *as, unsigned long iova)
|
||||||
if (--as->count[pde] == 0) {
|
if (--as->count[pde] == 0) {
|
||||||
struct tegra_smmu *smmu = as->smmu;
|
struct tegra_smmu *smmu = as->smmu;
|
||||||
u32 *pd = page_address(as->pd);
|
u32 *pd = page_address(as->pd);
|
||||||
dma_addr_t pte_dma = smmu_pde_to_dma(pd[pde]);
|
dma_addr_t pte_dma = smmu_pde_to_dma(smmu, pd[pde]);
|
||||||
|
|
||||||
tegra_smmu_set_pde(as, iova, 0);
|
tegra_smmu_set_pde(as, iova, 0);
|
||||||
|
|
||||||
|
|
|
@ -282,6 +282,10 @@ static int __init bcm7038_l1_init_one(struct device_node *dn,
|
||||||
pr_err("failed to map parent interrupt %d\n", parent_irq);
|
pr_err("failed to map parent interrupt %d\n", parent_irq);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (of_property_read_bool(dn, "brcm,irq-can-wake"))
|
||||||
|
enable_irq_wake(parent_irq);
|
||||||
|
|
||||||
irq_set_chained_handler_and_data(parent_irq, bcm7038_l1_irq_handle,
|
irq_set_chained_handler_and_data(parent_irq, bcm7038_l1_irq_handle,
|
||||||
intc);
|
intc);
|
||||||
|
|
||||||
|
|
|
@ -117,6 +117,14 @@ static int __init ingenic_intc_of_init(struct device_node *node,
|
||||||
goto out_unmap_irq;
|
goto out_unmap_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
domain = irq_domain_add_legacy(node, num_chips * 32,
|
||||||
|
JZ4740_IRQ_BASE, 0,
|
||||||
|
&irq_domain_simple_ops, NULL);
|
||||||
|
if (!domain) {
|
||||||
|
err = -ENOMEM;
|
||||||
|
goto out_unmap_base;
|
||||||
|
}
|
||||||
|
|
||||||
for (i = 0; i < num_chips; i++) {
|
for (i = 0; i < num_chips; i++) {
|
||||||
/* Mask all irqs */
|
/* Mask all irqs */
|
||||||
writel(0xffffffff, intc->base + (i * CHIP_SIZE) +
|
writel(0xffffffff, intc->base + (i * CHIP_SIZE) +
|
||||||
|
@ -143,14 +151,11 @@ static int __init ingenic_intc_of_init(struct device_node *node,
|
||||||
IRQ_NOPROBE | IRQ_LEVEL);
|
IRQ_NOPROBE | IRQ_LEVEL);
|
||||||
}
|
}
|
||||||
|
|
||||||
domain = irq_domain_add_legacy(node, num_chips * 32, JZ4740_IRQ_BASE, 0,
|
|
||||||
&irq_domain_simple_ops, NULL);
|
|
||||||
if (!domain)
|
|
||||||
pr_warn("unable to register IRQ domain\n");
|
|
||||||
|
|
||||||
setup_irq(parent_irq, &intc_cascade_action);
|
setup_irq(parent_irq, &intc_cascade_action);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
out_unmap_base:
|
||||||
|
iounmap(intc->base);
|
||||||
out_unmap_irq:
|
out_unmap_irq:
|
||||||
irq_dispose_mapping(parent_irq);
|
irq_dispose_mapping(parent_irq);
|
||||||
out_free:
|
out_free:
|
||||||
|
|
|
@ -681,6 +681,8 @@ static unsigned long bch_mca_scan(struct shrinker *shrink,
|
||||||
* IO can always make forward progress:
|
* IO can always make forward progress:
|
||||||
*/
|
*/
|
||||||
nr /= c->btree_pages;
|
nr /= c->btree_pages;
|
||||||
|
if (nr == 0)
|
||||||
|
nr = 1;
|
||||||
nr = min_t(unsigned long, nr, mca_can_free(c));
|
nr = min_t(unsigned long, nr, mca_can_free(c));
|
||||||
|
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
|
@ -419,10 +419,14 @@ static struct sensor_register ov2659_720p[] = {
|
||||||
{ REG_TIMING_YINC, 0x11 },
|
{ REG_TIMING_YINC, 0x11 },
|
||||||
{ REG_TIMING_VERT_FORMAT, 0x80 },
|
{ REG_TIMING_VERT_FORMAT, 0x80 },
|
||||||
{ REG_TIMING_HORIZ_FORMAT, 0x00 },
|
{ REG_TIMING_HORIZ_FORMAT, 0x00 },
|
||||||
|
{ 0x370a, 0x12 },
|
||||||
{ 0x3a03, 0xe8 },
|
{ 0x3a03, 0xe8 },
|
||||||
{ 0x3a09, 0x6f },
|
{ 0x3a09, 0x6f },
|
||||||
{ 0x3a0b, 0x5d },
|
{ 0x3a0b, 0x5d },
|
||||||
{ 0x3a15, 0x9a },
|
{ 0x3a15, 0x9a },
|
||||||
|
{ REG_VFIFO_READ_START_H, 0x00 },
|
||||||
|
{ REG_VFIFO_READ_START_L, 0x80 },
|
||||||
|
{ REG_ISP_CTRL02, 0x00 },
|
||||||
{ REG_NULL, 0x00 },
|
{ REG_NULL, 0x00 },
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1204,11 +1208,15 @@ static int ov2659_s_stream(struct v4l2_subdev *sd, int on)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
ov2659_set_pixel_clock(ov2659);
|
ret = ov2659_set_pixel_clock(ov2659);
|
||||||
ov2659_set_frame_size(ov2659);
|
if (!ret)
|
||||||
ov2659_set_format(ov2659);
|
ret = ov2659_set_frame_size(ov2659);
|
||||||
ov2659_set_streaming(ov2659, 1);
|
if (!ret)
|
||||||
ov2659->streaming = on;
|
ret = ov2659_set_format(ov2659);
|
||||||
|
if (!ret) {
|
||||||
|
ov2659_set_streaming(ov2659, 1);
|
||||||
|
ov2659->streaming = on;
|
||||||
|
}
|
||||||
|
|
||||||
unlock:
|
unlock:
|
||||||
mutex_unlock(&ov2659->lock);
|
mutex_unlock(&ov2659->lock);
|
||||||
|
|
|
@ -612,7 +612,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||||
dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code);
|
dev_err(&client->dev, "Pixel format not handled: 0x%x\n", code);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
priv->code = code;
|
|
||||||
|
|
||||||
if (code == MEDIA_BUS_FMT_Y8_1X8 ||
|
if (code == MEDIA_BUS_FMT_Y8_1X8 ||
|
||||||
code == MEDIA_BUS_FMT_SBGGR8_1X8) {
|
code == MEDIA_BUS_FMT_SBGGR8_1X8) {
|
||||||
|
@ -638,7 +637,6 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||||
dev_dbg(&client->dev, "max resolution: CIF\n");
|
dev_dbg(&client->dev, "max resolution: CIF\n");
|
||||||
coma_mask |= COMA_QCIF;
|
coma_mask |= COMA_QCIF;
|
||||||
}
|
}
|
||||||
priv->half_scale = half_scale;
|
|
||||||
|
|
||||||
if (sense) {
|
if (sense) {
|
||||||
if (sense->master_clock == 8000000) {
|
if (sense->master_clock == 8000000) {
|
||||||
|
@ -678,8 +676,13 @@ static int ov6650_s_fmt(struct v4l2_subdev *sd, struct v4l2_mbus_framefmt *mf)
|
||||||
ret = ov6650_reg_rmw(client, REG_COMA, coma_set, coma_mask);
|
ret = ov6650_reg_rmw(client, REG_COMA, coma_set, coma_mask);
|
||||||
if (!ret)
|
if (!ret)
|
||||||
ret = ov6650_reg_write(client, REG_CLKRC, clkrc);
|
ret = ov6650_reg_write(client, REG_CLKRC, clkrc);
|
||||||
if (!ret)
|
if (!ret) {
|
||||||
|
priv->half_scale = half_scale;
|
||||||
|
|
||||||
ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask);
|
ret = ov6650_reg_rmw(client, REG_COML, coml_set, coml_mask);
|
||||||
|
}
|
||||||
|
if (!ret)
|
||||||
|
priv->code = code;
|
||||||
|
|
||||||
if (!ret) {
|
if (!ret) {
|
||||||
mf->colorspace = priv->colorspace;
|
mf->colorspace = priv->colorspace;
|
||||||
|
|
|
@ -1847,6 +1847,10 @@ static int vpfe_s_std(struct file *file, void *priv, v4l2_std_id std_id)
|
||||||
if (!(sdinfo->inputs[0].capabilities & V4L2_IN_CAP_STD))
|
if (!(sdinfo->inputs[0].capabilities & V4L2_IN_CAP_STD))
|
||||||
return -ENODATA;
|
return -ENODATA;
|
||||||
|
|
||||||
|
/* if trying to set the same std then nothing to do */
|
||||||
|
if (vpfe_standards[vpfe->std_index].std_id == std_id)
|
||||||
|
return 0;
|
||||||
|
|
||||||
/* If streaming is started, return error */
|
/* If streaming is started, return error */
|
||||||
if (vb2_is_busy(&vpfe->buffer_queue)) {
|
if (vb2_is_busy(&vpfe->buffer_queue)) {
|
||||||
vpfe_err(vpfe, "%s device busy\n", __func__);
|
vpfe_err(vpfe, "%s device busy\n", __func__);
|
||||||
|
|
|
@ -330,20 +330,25 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* find our format description corresponding to the passed v4l2_format */
|
/* find our format description corresponding to the passed v4l2_format */
|
||||||
static struct vpe_fmt *find_format(struct v4l2_format *f)
|
static struct vpe_fmt *__find_format(u32 fourcc)
|
||||||
{
|
{
|
||||||
struct vpe_fmt *fmt;
|
struct vpe_fmt *fmt;
|
||||||
unsigned int k;
|
unsigned int k;
|
||||||
|
|
||||||
for (k = 0; k < ARRAY_SIZE(vpe_formats); k++) {
|
for (k = 0; k < ARRAY_SIZE(vpe_formats); k++) {
|
||||||
fmt = &vpe_formats[k];
|
fmt = &vpe_formats[k];
|
||||||
if (fmt->fourcc == f->fmt.pix.pixelformat)
|
if (fmt->fourcc == fourcc)
|
||||||
return fmt;
|
return fmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct vpe_fmt *find_format(struct v4l2_format *f)
|
||||||
|
{
|
||||||
|
return __find_format(f->fmt.pix.pixelformat);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* there is one vpe_dev structure in the driver, it is shared by
|
* there is one vpe_dev structure in the driver, it is shared by
|
||||||
* all instances.
|
* all instances.
|
||||||
|
@ -1293,6 +1298,7 @@ static irqreturn_t vpe_irq(int irq_vpe, void *data)
|
||||||
d_vb->timecode = s_vb->timecode;
|
d_vb->timecode = s_vb->timecode;
|
||||||
|
|
||||||
d_vb->sequence = ctx->sequence;
|
d_vb->sequence = ctx->sequence;
|
||||||
|
s_vb->sequence = ctx->sequence;
|
||||||
|
|
||||||
d_q_data = &ctx->q_data[Q_DATA_DST];
|
d_q_data = &ctx->q_data[Q_DATA_DST];
|
||||||
if (d_q_data->flags & Q_DATA_INTERLACED) {
|
if (d_q_data->flags & Q_DATA_INTERLACED) {
|
||||||
|
@ -1433,9 +1439,9 @@ static int __vpe_try_fmt(struct vpe_ctx *ctx, struct v4l2_format *f,
|
||||||
int i, depth, depth_bytes;
|
int i, depth, depth_bytes;
|
||||||
|
|
||||||
if (!fmt || !(fmt->types & type)) {
|
if (!fmt || !(fmt->types & type)) {
|
||||||
vpe_err(ctx->dev, "Fourcc format (0x%08x) invalid.\n",
|
vpe_dbg(ctx->dev, "Fourcc format (0x%08x) invalid.\n",
|
||||||
pix->pixelformat);
|
pix->pixelformat);
|
||||||
return -EINVAL;
|
fmt = __find_format(V4L2_PIX_FMT_YUYV);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pix->field != V4L2_FIELD_NONE && pix->field != V4L2_FIELD_ALTERNATE)
|
if (pix->field != V4L2_FIELD_NONE && pix->field != V4L2_FIELD_ALTERNATE)
|
||||||
|
@ -1992,7 +1998,7 @@ static int vpe_open(struct file *file)
|
||||||
v4l2_ctrl_handler_setup(hdl);
|
v4l2_ctrl_handler_setup(hdl);
|
||||||
|
|
||||||
s_q_data = &ctx->q_data[Q_DATA_SRC];
|
s_q_data = &ctx->q_data[Q_DATA_SRC];
|
||||||
s_q_data->fmt = &vpe_formats[2];
|
s_q_data->fmt = __find_format(V4L2_PIX_FMT_YUYV);
|
||||||
s_q_data->width = 1920;
|
s_q_data->width = 1920;
|
||||||
s_q_data->height = 1080;
|
s_q_data->height = 1080;
|
||||||
s_q_data->bytesperline[VPE_LUMA] = (s_q_data->width *
|
s_q_data->bytesperline[VPE_LUMA] = (s_q_data->width *
|
||||||
|
|
|
@ -460,6 +460,8 @@ static int si470x_i2c_remove(struct i2c_client *client)
|
||||||
video_unregister_device(&radio->videodev);
|
video_unregister_device(&radio->videodev);
|
||||||
kfree(radio);
|
kfree(radio);
|
||||||
|
|
||||||
|
v4l2_ctrl_handler_free(&radio->hdl);
|
||||||
|
v4l2_device_unregister(&radio->v4l2_dev);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -504,7 +504,13 @@ urb_error:
|
||||||
static int flexcop_usb_init(struct flexcop_usb *fc_usb)
|
static int flexcop_usb_init(struct flexcop_usb *fc_usb)
|
||||||
{
|
{
|
||||||
/* use the alternate setting with the larges buffer */
|
/* use the alternate setting with the larges buffer */
|
||||||
usb_set_interface(fc_usb->udev,0,1);
|
int ret = usb_set_interface(fc_usb->udev, 0, 1);
|
||||||
|
|
||||||
|
if (ret) {
|
||||||
|
err("set interface failed.");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
switch (fc_usb->udev->speed) {
|
switch (fc_usb->udev->speed) {
|
||||||
case USB_SPEED_LOW:
|
case USB_SPEED_LOW:
|
||||||
err("cannot handle USB speed because it is too slow.");
|
err("cannot handle USB speed because it is too slow.");
|
||||||
|
|
|
@ -919,8 +919,12 @@ static void pvr2_v4l2_internal_check(struct pvr2_channel *chp)
|
||||||
pvr2_v4l2_dev_disassociate_parent(vp->dev_video);
|
pvr2_v4l2_dev_disassociate_parent(vp->dev_video);
|
||||||
pvr2_v4l2_dev_disassociate_parent(vp->dev_radio);
|
pvr2_v4l2_dev_disassociate_parent(vp->dev_radio);
|
||||||
if (!list_empty(&vp->dev_video->devbase.fh_list) ||
|
if (!list_empty(&vp->dev_video->devbase.fh_list) ||
|
||||||
!list_empty(&vp->dev_radio->devbase.fh_list))
|
(vp->dev_radio &&
|
||||||
|
!list_empty(&vp->dev_radio->devbase.fh_list))) {
|
||||||
|
pvr2_trace(PVR2_TRACE_STRUCT,
|
||||||
|
"pvr2_v4l2 internal_check exit-empty id=%p", vp);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
pvr2_v4l2_destroy_no_lock(vp);
|
pvr2_v4l2_destroy_no_lock(vp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -994,7 +998,8 @@ static int pvr2_v4l2_release(struct file *file)
|
||||||
kfree(fhp);
|
kfree(fhp);
|
||||||
if (vp->channel.mc_head->disconnect_flag &&
|
if (vp->channel.mc_head->disconnect_flag &&
|
||||||
list_empty(&vp->dev_video->devbase.fh_list) &&
|
list_empty(&vp->dev_video->devbase.fh_list) &&
|
||||||
list_empty(&vp->dev_radio->devbase.fh_list)) {
|
(!vp->dev_radio ||
|
||||||
|
list_empty(&vp->dev_radio->devbase.fh_list))) {
|
||||||
pvr2_v4l2_destroy_no_lock(vp);
|
pvr2_v4l2_destroy_no_lock(vp);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -637,8 +637,8 @@ static int sdhci_esdhc_probe(struct platform_device *pdev)
|
||||||
host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ;
|
host->quirks &= ~SDHCI_QUIRK_NO_BUSY_IRQ;
|
||||||
|
|
||||||
if (of_find_compatible_node(NULL, NULL, "fsl,p2020-esdhc")) {
|
if (of_find_compatible_node(NULL, NULL, "fsl,p2020-esdhc")) {
|
||||||
host->quirks2 |= SDHCI_QUIRK_RESET_AFTER_REQUEST;
|
host->quirks |= SDHCI_QUIRK_RESET_AFTER_REQUEST;
|
||||||
host->quirks2 |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
|
host->quirks |= SDHCI_QUIRK_BROKEN_TIMEOUT_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (of_device_is_compatible(np, "fsl,p5040-esdhc") ||
|
if (of_device_is_compatible(np, "fsl,p5040-esdhc") ||
|
||||||
|
|
|
@ -1557,9 +1557,7 @@ void sdhci_set_uhs_signaling(struct sdhci_host *host, unsigned timing)
|
||||||
ctrl_2 |= SDHCI_CTRL_UHS_SDR104;
|
ctrl_2 |= SDHCI_CTRL_UHS_SDR104;
|
||||||
else if (timing == MMC_TIMING_UHS_SDR12)
|
else if (timing == MMC_TIMING_UHS_SDR12)
|
||||||
ctrl_2 |= SDHCI_CTRL_UHS_SDR12;
|
ctrl_2 |= SDHCI_CTRL_UHS_SDR12;
|
||||||
else if (timing == MMC_TIMING_SD_HS ||
|
else if (timing == MMC_TIMING_UHS_SDR25)
|
||||||
timing == MMC_TIMING_MMC_HS ||
|
|
||||||
timing == MMC_TIMING_UHS_SDR25)
|
|
||||||
ctrl_2 |= SDHCI_CTRL_UHS_SDR25;
|
ctrl_2 |= SDHCI_CTRL_UHS_SDR25;
|
||||||
else if (timing == MMC_TIMING_UHS_SDR50)
|
else if (timing == MMC_TIMING_UHS_SDR50)
|
||||||
ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
|
ctrl_2 |= SDHCI_CTRL_UHS_SDR50;
|
||||||
|
@ -2100,7 +2098,7 @@ static int sdhci_execute_tuning(struct mmc_host *mmc, u32 opcode)
|
||||||
spin_lock_irqsave(&host->lock, flags);
|
spin_lock_irqsave(&host->lock, flags);
|
||||||
|
|
||||||
if (!host->tuning_done) {
|
if (!host->tuning_done) {
|
||||||
pr_info(DRIVER_NAME ": Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock\n");
|
pr_debug(DRIVER_NAME ": Timeout waiting for Buffer Read Ready interrupt during tuning procedure, falling back to fixed sampling clock\n");
|
||||||
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
ctrl = sdhci_readw(host, SDHCI_HOST_CONTROL2);
|
||||||
ctrl &= ~SDHCI_CTRL_TUNED_CLK;
|
ctrl &= ~SDHCI_CTRL_TUNED_CLK;
|
||||||
ctrl &= ~SDHCI_CTRL_EXEC_TUNING;
|
ctrl &= ~SDHCI_CTRL_EXEC_TUNING;
|
||||||
|
|
|
@ -1076,7 +1076,7 @@ int tmio_mmc_host_probe(struct tmio_mmc_host *_host,
|
||||||
tmio_mmc_ops.start_signal_voltage_switch = _host->start_signal_voltage_switch;
|
tmio_mmc_ops.start_signal_voltage_switch = _host->start_signal_voltage_switch;
|
||||||
mmc->ops = &tmio_mmc_ops;
|
mmc->ops = &tmio_mmc_ops;
|
||||||
|
|
||||||
mmc->caps |= MMC_CAP_4_BIT_DATA | pdata->capabilities;
|
mmc->caps |= MMC_CAP_ERASE | MMC_CAP_4_BIT_DATA | pdata->capabilities;
|
||||||
mmc->caps2 |= pdata->capabilities2;
|
mmc->caps2 |= pdata->capabilities2;
|
||||||
mmc->max_segs = 32;
|
mmc->max_segs = 32;
|
||||||
mmc->max_blk_size = 512;
|
mmc->max_blk_size = 512;
|
||||||
|
|
|
@ -1105,8 +1105,8 @@ static int ena_io_poll(struct napi_struct *napi, int budget)
|
||||||
struct ena_ring *tx_ring, *rx_ring;
|
struct ena_ring *tx_ring, *rx_ring;
|
||||||
struct ena_eth_io_intr_reg intr_reg;
|
struct ena_eth_io_intr_reg intr_reg;
|
||||||
|
|
||||||
u32 tx_work_done;
|
int tx_work_done;
|
||||||
u32 rx_work_done;
|
int rx_work_done = 0;
|
||||||
int tx_budget;
|
int tx_budget;
|
||||||
int napi_comp_call = 0;
|
int napi_comp_call = 0;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -1122,7 +1122,11 @@ static int ena_io_poll(struct napi_struct *napi, int budget)
|
||||||
}
|
}
|
||||||
|
|
||||||
tx_work_done = ena_clean_tx_irq(tx_ring, tx_budget);
|
tx_work_done = ena_clean_tx_irq(tx_ring, tx_budget);
|
||||||
rx_work_done = ena_clean_rx_irq(rx_ring, napi, budget);
|
/* On netpoll the budget is zero and the handler should only clean the
|
||||||
|
* tx completions.
|
||||||
|
*/
|
||||||
|
if (likely(budget))
|
||||||
|
rx_work_done = ena_clean_rx_irq(rx_ring, napi, budget);
|
||||||
|
|
||||||
if ((budget > rx_work_done) && (tx_budget > tx_work_done)) {
|
if ((budget > rx_work_done) && (tx_budget > tx_work_done)) {
|
||||||
napi_complete_done(napi, rx_work_done);
|
napi_complete_done(napi, rx_work_done);
|
||||||
|
|
|
@ -2376,15 +2376,21 @@ static int bnx2x_set_pf_tx_switching(struct bnx2x *bp, bool enable)
|
||||||
/* send the ramrod on all the queues of the PF */
|
/* send the ramrod on all the queues of the PF */
|
||||||
for_each_eth_queue(bp, i) {
|
for_each_eth_queue(bp, i) {
|
||||||
struct bnx2x_fastpath *fp = &bp->fp[i];
|
struct bnx2x_fastpath *fp = &bp->fp[i];
|
||||||
|
int tx_idx;
|
||||||
|
|
||||||
/* Set the appropriate Queue object */
|
/* Set the appropriate Queue object */
|
||||||
q_params.q_obj = &bnx2x_sp_obj(bp, fp).q_obj;
|
q_params.q_obj = &bnx2x_sp_obj(bp, fp).q_obj;
|
||||||
|
|
||||||
/* Update the Queue state */
|
for (tx_idx = FIRST_TX_COS_INDEX;
|
||||||
rc = bnx2x_queue_state_change(bp, &q_params);
|
tx_idx < fp->max_cos; tx_idx++) {
|
||||||
if (rc) {
|
q_params.params.update.cid_index = tx_idx;
|
||||||
BNX2X_ERR("Failed to configure Tx switching\n");
|
|
||||||
return rc;
|
/* Update the Queue state */
|
||||||
|
rc = bnx2x_queue_state_change(bp, &q_params);
|
||||||
|
if (rc) {
|
||||||
|
BNX2X_ERR("Failed to configure Tx switching\n");
|
||||||
|
return rc;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -455,9 +455,9 @@ static int hip04_mac_start_xmit(struct sk_buff *skb, struct net_device *ndev)
|
||||||
skb_tx_timestamp(skb);
|
skb_tx_timestamp(skb);
|
||||||
|
|
||||||
hip04_set_xmit_desc(priv, phys);
|
hip04_set_xmit_desc(priv, phys);
|
||||||
priv->tx_head = TX_NEXT(tx_head);
|
|
||||||
count++;
|
count++;
|
||||||
netdev_sent_queue(ndev, skb->len);
|
netdev_sent_queue(ndev, skb->len);
|
||||||
|
priv->tx_head = TX_NEXT(tx_head);
|
||||||
|
|
||||||
stats->tx_bytes += skb->len;
|
stats->tx_bytes += skb->len;
|
||||||
stats->tx_packets++;
|
stats->tx_packets++;
|
||||||
|
|
|
@ -2752,6 +2752,9 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev)
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
for (i = 0; i < qdev->num_large_buffers; i++) {
|
for (i = 0; i < qdev->num_large_buffers; i++) {
|
||||||
|
lrg_buf_cb = &qdev->lrg_buf[i];
|
||||||
|
memset(lrg_buf_cb, 0, sizeof(struct ql_rcv_buf_cb));
|
||||||
|
|
||||||
skb = netdev_alloc_skb(qdev->ndev,
|
skb = netdev_alloc_skb(qdev->ndev,
|
||||||
qdev->lrg_buffer_len);
|
qdev->lrg_buffer_len);
|
||||||
if (unlikely(!skb)) {
|
if (unlikely(!skb)) {
|
||||||
|
@ -2762,11 +2765,7 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev)
|
||||||
ql_free_large_buffers(qdev);
|
ql_free_large_buffers(qdev);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
lrg_buf_cb = &qdev->lrg_buf[i];
|
|
||||||
memset(lrg_buf_cb, 0, sizeof(struct ql_rcv_buf_cb));
|
|
||||||
lrg_buf_cb->index = i;
|
lrg_buf_cb->index = i;
|
||||||
lrg_buf_cb->skb = skb;
|
|
||||||
/*
|
/*
|
||||||
* We save some space to copy the ethhdr from first
|
* We save some space to copy the ethhdr from first
|
||||||
* buffer
|
* buffer
|
||||||
|
@ -2788,6 +2787,7 @@ static int ql_alloc_large_buffers(struct ql3_adapter *qdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
lrg_buf_cb->skb = skb;
|
||||||
dma_unmap_addr_set(lrg_buf_cb, mapaddr, map);
|
dma_unmap_addr_set(lrg_buf_cb, mapaddr, map);
|
||||||
dma_unmap_len_set(lrg_buf_cb, maplen,
|
dma_unmap_len_set(lrg_buf_cb, maplen,
|
||||||
qdev->lrg_buffer_len -
|
qdev->lrg_buffer_len -
|
||||||
|
|
|
@ -148,6 +148,9 @@ static int fjes_acpi_add(struct acpi_device *device)
|
||||||
/* create platform_device */
|
/* create platform_device */
|
||||||
plat_dev = platform_device_register_simple(DRV_NAME, 0, fjes_resource,
|
plat_dev = platform_device_register_simple(DRV_NAME, 0, fjes_resource,
|
||||||
ARRAY_SIZE(fjes_resource));
|
ARRAY_SIZE(fjes_resource));
|
||||||
|
if (IS_ERR(plat_dev))
|
||||||
|
return PTR_ERR(plat_dev);
|
||||||
|
|
||||||
device->driver_data = plat_dev;
|
device->driver_data = plat_dev;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -42,7 +42,6 @@ struct pdp_ctx {
|
||||||
struct hlist_node hlist_addr;
|
struct hlist_node hlist_addr;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
u64 tid;
|
|
||||||
struct {
|
struct {
|
||||||
u64 tid;
|
u64 tid;
|
||||||
u16 flow;
|
u16 flow;
|
||||||
|
@ -678,10 +677,13 @@ static int gtp_newlink(struct net *src_net, struct net_device *dev,
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto out_err;
|
goto out_err;
|
||||||
|
|
||||||
if (!data[IFLA_GTP_PDP_HASHSIZE])
|
if (!data[IFLA_GTP_PDP_HASHSIZE]) {
|
||||||
hashsize = 1024;
|
hashsize = 1024;
|
||||||
else
|
} else {
|
||||||
hashsize = nla_get_u32(data[IFLA_GTP_PDP_HASHSIZE]);
|
hashsize = nla_get_u32(data[IFLA_GTP_PDP_HASHSIZE]);
|
||||||
|
if (!hashsize)
|
||||||
|
hashsize = 1024;
|
||||||
|
}
|
||||||
|
|
||||||
err = gtp_hashtable_new(gtp, hashsize);
|
err = gtp_hashtable_new(gtp, hashsize);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
|
@ -1221,43 +1223,46 @@ static int gtp_genl_dump_pdp(struct sk_buff *skb,
|
||||||
struct netlink_callback *cb)
|
struct netlink_callback *cb)
|
||||||
{
|
{
|
||||||
struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp;
|
struct gtp_dev *last_gtp = (struct gtp_dev *)cb->args[2], *gtp;
|
||||||
|
int i, j, bucket = cb->args[0], skip = cb->args[1];
|
||||||
struct net *net = sock_net(skb->sk);
|
struct net *net = sock_net(skb->sk);
|
||||||
struct gtp_net *gn = net_generic(net, gtp_net_id);
|
|
||||||
unsigned long tid = cb->args[1];
|
|
||||||
int i, k = cb->args[0], ret;
|
|
||||||
struct pdp_ctx *pctx;
|
struct pdp_ctx *pctx;
|
||||||
|
struct gtp_net *gn;
|
||||||
|
|
||||||
|
gn = net_generic(net, gtp_net_id);
|
||||||
|
|
||||||
if (cb->args[4])
|
if (cb->args[4])
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
rcu_read_lock();
|
||||||
list_for_each_entry_rcu(gtp, &gn->gtp_dev_list, list) {
|
list_for_each_entry_rcu(gtp, &gn->gtp_dev_list, list) {
|
||||||
if (last_gtp && last_gtp != gtp)
|
if (last_gtp && last_gtp != gtp)
|
||||||
continue;
|
continue;
|
||||||
else
|
else
|
||||||
last_gtp = NULL;
|
last_gtp = NULL;
|
||||||
|
|
||||||
for (i = k; i < gtp->hash_size; i++) {
|
for (i = bucket; i < gtp->hash_size; i++) {
|
||||||
hlist_for_each_entry_rcu(pctx, >p->tid_hash[i], hlist_tid) {
|
j = 0;
|
||||||
if (tid && tid != pctx->u.tid)
|
hlist_for_each_entry_rcu(pctx, >p->tid_hash[i],
|
||||||
continue;
|
hlist_tid) {
|
||||||
else
|
if (j >= skip &&
|
||||||
tid = 0;
|
gtp_genl_fill_info(skb,
|
||||||
|
NETLINK_CB(cb->skb).portid,
|
||||||
ret = gtp_genl_fill_info(skb,
|
cb->nlh->nlmsg_seq,
|
||||||
NETLINK_CB(cb->skb).portid,
|
cb->nlh->nlmsg_type, pctx)) {
|
||||||
cb->nlh->nlmsg_seq,
|
|
||||||
cb->nlh->nlmsg_type, pctx);
|
|
||||||
if (ret < 0) {
|
|
||||||
cb->args[0] = i;
|
cb->args[0] = i;
|
||||||
cb->args[1] = pctx->u.tid;
|
cb->args[1] = j;
|
||||||
cb->args[2] = (unsigned long)gtp;
|
cb->args[2] = (unsigned long)gtp;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
j++;
|
||||||
}
|
}
|
||||||
|
skip = 0;
|
||||||
}
|
}
|
||||||
|
bucket = 0;
|
||||||
}
|
}
|
||||||
cb->args[4] = 1;
|
cb->args[4] = 1;
|
||||||
out:
|
out:
|
||||||
|
rcu_read_unlock();
|
||||||
return skb->len;
|
return skb->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -665,10 +665,10 @@ static void sixpack_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct sixpack *sp;
|
struct sixpack *sp;
|
||||||
|
|
||||||
write_lock_bh(&disc_data_lock);
|
write_lock_irq(&disc_data_lock);
|
||||||
sp = tty->disc_data;
|
sp = tty->disc_data;
|
||||||
tty->disc_data = NULL;
|
tty->disc_data = NULL;
|
||||||
write_unlock_bh(&disc_data_lock);
|
write_unlock_irq(&disc_data_lock);
|
||||||
if (!sp)
|
if (!sp)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
|
|
@ -783,10 +783,10 @@ static void mkiss_close(struct tty_struct *tty)
|
||||||
{
|
{
|
||||||
struct mkiss *ax;
|
struct mkiss *ax;
|
||||||
|
|
||||||
write_lock_bh(&disc_data_lock);
|
write_lock_irq(&disc_data_lock);
|
||||||
ax = tty->disc_data;
|
ax = tty->disc_data;
|
||||||
tty->disc_data = NULL;
|
tty->disc_data = NULL;
|
||||||
write_unlock_bh(&disc_data_lock);
|
write_unlock_irq(&disc_data_lock);
|
||||||
|
|
||||||
if (!ax)
|
if (!ax)
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -324,8 +324,8 @@ struct phy_device *phy_device_create(struct mii_bus *bus, int addr, int phy_id,
|
||||||
mdiodev->device_free = phy_mdio_device_free;
|
mdiodev->device_free = phy_mdio_device_free;
|
||||||
mdiodev->device_remove = phy_mdio_device_remove;
|
mdiodev->device_remove = phy_mdio_device_remove;
|
||||||
|
|
||||||
dev->speed = 0;
|
dev->speed = SPEED_UNKNOWN;
|
||||||
dev->duplex = -1;
|
dev->duplex = DUPLEX_UNKNOWN;
|
||||||
dev->pause = 0;
|
dev->pause = 0;
|
||||||
dev->asym_pause = 0;
|
dev->asym_pause = 0;
|
||||||
dev->link = 1;
|
dev->link = 1;
|
||||||
|
|
|
@ -1763,6 +1763,7 @@ static int lan78xx_mdio_init(struct lan78xx_net *dev)
|
||||||
dev->mdiobus->read = lan78xx_mdiobus_read;
|
dev->mdiobus->read = lan78xx_mdiobus_read;
|
||||||
dev->mdiobus->write = lan78xx_mdiobus_write;
|
dev->mdiobus->write = lan78xx_mdiobus_write;
|
||||||
dev->mdiobus->name = "lan78xx-mdiobus";
|
dev->mdiobus->name = "lan78xx-mdiobus";
|
||||||
|
dev->mdiobus->parent = &dev->udev->dev;
|
||||||
|
|
||||||
snprintf(dev->mdiobus->id, MII_BUS_ID_SIZE, "usb-%03d:%03d",
|
snprintf(dev->mdiobus->id, MII_BUS_ID_SIZE, "usb-%03d:%03d",
|
||||||
dev->udev->bus->busnum, dev->udev->devnum);
|
dev->udev->bus->busnum, dev->udev->devnum);
|
||||||
|
|
|
@ -99,6 +99,8 @@ int ath10k_txrx_tx_unref(struct ath10k_htt *htt,
|
||||||
|
|
||||||
info = IEEE80211_SKB_CB(msdu);
|
info = IEEE80211_SKB_CB(msdu);
|
||||||
memset(&info->status, 0, sizeof(info->status));
|
memset(&info->status, 0, sizeof(info->status));
|
||||||
|
info->status.rates[0].idx = -1;
|
||||||
|
|
||||||
trace_ath10k_txrx_tx_unref(ar, tx_done->msdu_id);
|
trace_ath10k_txrx_tx_unref(ar, tx_done->msdu_id);
|
||||||
|
|
||||||
if (tx_done->status == HTT_TX_COMPL_STATE_DISCARD) {
|
if (tx_done->status == HTT_TX_COMPL_STATE_DISCARD) {
|
||||||
|
|
|
@ -185,6 +185,9 @@ void iwl_leds_init(struct iwl_priv *priv)
|
||||||
|
|
||||||
priv->led.name = kasprintf(GFP_KERNEL, "%s-led",
|
priv->led.name = kasprintf(GFP_KERNEL, "%s-led",
|
||||||
wiphy_name(priv->hw->wiphy));
|
wiphy_name(priv->hw->wiphy));
|
||||||
|
if (!priv->led.name)
|
||||||
|
return;
|
||||||
|
|
||||||
priv->led.brightness_set = iwl_led_brightness_set;
|
priv->led.brightness_set = iwl_led_brightness_set;
|
||||||
priv->led.blink_set = iwl_led_blink_set;
|
priv->led.blink_set = iwl_led_blink_set;
|
||||||
priv->led.max_brightness = 1;
|
priv->led.max_brightness = 1;
|
||||||
|
|
|
@ -109,6 +109,9 @@ int iwl_mvm_leds_init(struct iwl_mvm *mvm)
|
||||||
|
|
||||||
mvm->led.name = kasprintf(GFP_KERNEL, "%s-led",
|
mvm->led.name = kasprintf(GFP_KERNEL, "%s-led",
|
||||||
wiphy_name(mvm->hw->wiphy));
|
wiphy_name(mvm->hw->wiphy));
|
||||||
|
if (!mvm->led.name)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
mvm->led.brightness_set = iwl_led_brightness_set;
|
mvm->led.brightness_set = iwl_led_brightness_set;
|
||||||
mvm->led.max_brightness = 1;
|
mvm->led.max_brightness = 1;
|
||||||
|
|
||||||
|
|
|
@ -62,6 +62,7 @@
|
||||||
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
#include <asm/unaligned.h>
|
||||||
#include <linux/etherdevice.h>
|
#include <linux/etherdevice.h>
|
||||||
#include <linux/skbuff.h>
|
#include <linux/skbuff.h>
|
||||||
#include "iwl-trans.h"
|
#include "iwl-trans.h"
|
||||||
|
@ -289,7 +290,7 @@ void iwl_mvm_rx_rx_mpdu(struct iwl_mvm *mvm, struct napi_struct *napi,
|
||||||
rx_res = (struct iwl_rx_mpdu_res_start *)pkt->data;
|
rx_res = (struct iwl_rx_mpdu_res_start *)pkt->data;
|
||||||
hdr = (struct ieee80211_hdr *)(pkt->data + sizeof(*rx_res));
|
hdr = (struct ieee80211_hdr *)(pkt->data + sizeof(*rx_res));
|
||||||
len = le16_to_cpu(rx_res->byte_count);
|
len = le16_to_cpu(rx_res->byte_count);
|
||||||
rx_pkt_status = le32_to_cpup((__le32 *)
|
rx_pkt_status = get_unaligned_le32((__le32 *)
|
||||||
(pkt->data + sizeof(*rx_res) + len));
|
(pkt->data + sizeof(*rx_res) + len));
|
||||||
|
|
||||||
/* Dont use dev_alloc_skb(), we'll have enough headroom once
|
/* Dont use dev_alloc_skb(), we'll have enough headroom once
|
||||||
|
|
|
@ -1229,6 +1229,10 @@ static int if_sdio_probe(struct sdio_func *func,
|
||||||
|
|
||||||
spin_lock_init(&card->lock);
|
spin_lock_init(&card->lock);
|
||||||
card->workqueue = alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0);
|
card->workqueue = alloc_workqueue("libertas_sdio", WQ_MEM_RECLAIM, 0);
|
||||||
|
if (unlikely(!card->workqueue)) {
|
||||||
|
ret = -ENOMEM;
|
||||||
|
goto err_queue;
|
||||||
|
}
|
||||||
INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
|
INIT_WORK(&card->packet_worker, if_sdio_host_to_card_worker);
|
||||||
init_waitqueue_head(&card->pwron_waitq);
|
init_waitqueue_head(&card->pwron_waitq);
|
||||||
|
|
||||||
|
@ -1282,6 +1286,7 @@ err_activate_card:
|
||||||
lbs_remove_card(priv);
|
lbs_remove_card(priv);
|
||||||
free:
|
free:
|
||||||
destroy_workqueue(card->workqueue);
|
destroy_workqueue(card->workqueue);
|
||||||
|
err_queue:
|
||||||
while (card->packets) {
|
while (card->packets) {
|
||||||
packet = card->packets;
|
packet = card->packets;
|
||||||
card->packets = card->packets->next;
|
card->packets = card->packets->next;
|
||||||
|
|
|
@ -632,8 +632,11 @@ static int mwifiex_pcie_init_evt_ring(struct mwifiex_adapter *adapter)
|
||||||
skb_put(skb, MAX_EVENT_SIZE);
|
skb_put(skb, MAX_EVENT_SIZE);
|
||||||
|
|
||||||
if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
|
if (mwifiex_map_pci_memory(adapter, skb, MAX_EVENT_SIZE,
|
||||||
PCI_DMA_FROMDEVICE))
|
PCI_DMA_FROMDEVICE)) {
|
||||||
|
kfree_skb(skb);
|
||||||
|
kfree(card->evtbd_ring_vbase);
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
|
buf_pa = MWIFIEX_SKB_DMA_ADDR(skb);
|
||||||
|
|
||||||
|
|
|
@ -1348,6 +1348,7 @@ struct rtl8xxxu_fileops {
|
||||||
u8 has_s0s1:1;
|
u8 has_s0s1:1;
|
||||||
u8 has_tx_report:1;
|
u8 has_tx_report:1;
|
||||||
u8 gen2_thermal_meter:1;
|
u8 gen2_thermal_meter:1;
|
||||||
|
u8 needs_full_init:1;
|
||||||
u32 adda_1t_init;
|
u32 adda_1t_init;
|
||||||
u32 adda_1t_path_on;
|
u32 adda_1t_path_on;
|
||||||
u32 adda_2t_path_on_a;
|
u32 adda_2t_path_on_a;
|
||||||
|
|
|
@ -1673,6 +1673,7 @@ struct rtl8xxxu_fileops rtl8723bu_fops = {
|
||||||
.has_s0s1 = 1,
|
.has_s0s1 = 1,
|
||||||
.has_tx_report = 1,
|
.has_tx_report = 1,
|
||||||
.gen2_thermal_meter = 1,
|
.gen2_thermal_meter = 1,
|
||||||
|
.needs_full_init = 1,
|
||||||
.adda_1t_init = 0x01c00014,
|
.adda_1t_init = 0x01c00014,
|
||||||
.adda_1t_path_on = 0x01c00014,
|
.adda_1t_path_on = 0x01c00014,
|
||||||
.adda_2t_path_on_a = 0x01c00014,
|
.adda_2t_path_on_a = 0x01c00014,
|
||||||
|
|
|
@ -3905,6 +3905,9 @@ static int rtl8xxxu_init_device(struct ieee80211_hw *hw)
|
||||||
else
|
else
|
||||||
macpower = true;
|
macpower = true;
|
||||||
|
|
||||||
|
if (fops->needs_full_init)
|
||||||
|
macpower = false;
|
||||||
|
|
||||||
ret = fops->power_on(priv);
|
ret = fops->power_on(priv);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_warn(dev, "%s: Failed power on\n", __func__);
|
dev_warn(dev, "%s: Failed power on\n", __func__);
|
||||||
|
|
|
@ -1576,6 +1576,8 @@ static bool usb_cmd_send_packet(struct ieee80211_hw *hw, struct sk_buff *skb)
|
||||||
* This is maybe necessary:
|
* This is maybe necessary:
|
||||||
* rtlpriv->cfg->ops->fill_tx_cmddesc(hw, buffer, 1, 1, skb);
|
* rtlpriv->cfg->ops->fill_tx_cmddesc(hw, buffer, 1, 1, skb);
|
||||||
*/
|
*/
|
||||||
|
dev_kfree_skb(skb);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1088,8 +1088,10 @@ int rtl_usb_probe(struct usb_interface *intf,
|
||||||
rtlpriv->hw = hw;
|
rtlpriv->hw = hw;
|
||||||
rtlpriv->usb_data = kzalloc(RTL_USB_MAX_RX_COUNT * sizeof(u32),
|
rtlpriv->usb_data = kzalloc(RTL_USB_MAX_RX_COUNT * sizeof(u32),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!rtlpriv->usb_data)
|
if (!rtlpriv->usb_data) {
|
||||||
|
ieee80211_free_hw(hw);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
/* this spin lock must be initialized early */
|
/* this spin lock must be initialized early */
|
||||||
spin_lock_init(&rtlpriv->locks.usb_lock);
|
spin_lock_init(&rtlpriv->locks.usb_lock);
|
||||||
|
@ -1152,6 +1154,7 @@ error_out:
|
||||||
_rtl_usb_io_handler_release(hw);
|
_rtl_usb_io_handler_release(hw);
|
||||||
usb_put_dev(udev);
|
usb_put_dev(udev);
|
||||||
complete(&rtlpriv->firmware_loading_complete);
|
complete(&rtlpriv->firmware_loading_complete);
|
||||||
|
kfree(rtlpriv->usb_data);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(rtl_usb_probe);
|
EXPORT_SYMBOL(rtl_usb_probe);
|
||||||
|
|
|
@ -230,6 +230,18 @@ static int port_check(struct device *dev, void *dev_drv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterates through all the devices connected to the bus and return 1
|
||||||
|
* if the device is a parallel port.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int port_detect(struct device *dev, void *dev_drv)
|
||||||
|
{
|
||||||
|
if (is_parport(dev))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* parport_register_driver - register a parallel port device driver
|
* parport_register_driver - register a parallel port device driver
|
||||||
* @drv: structure describing the driver
|
* @drv: structure describing the driver
|
||||||
|
@ -282,6 +294,15 @@ int __parport_register_driver(struct parport_driver *drv, struct module *owner,
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* check if bus has any parallel port registered, if
|
||||||
|
* none is found then load the lowlevel driver.
|
||||||
|
*/
|
||||||
|
ret = bus_for_each_dev(&parport_bus_type, NULL, NULL,
|
||||||
|
port_detect);
|
||||||
|
if (!ret)
|
||||||
|
get_lowlevel_driver();
|
||||||
|
|
||||||
mutex_lock(®istration_lock);
|
mutex_lock(®istration_lock);
|
||||||
if (drv->match_port)
|
if (drv->match_port)
|
||||||
bus_for_each_dev(&parport_bus_type, NULL, drv,
|
bus_for_each_dev(&parport_bus_type, NULL, drv,
|
||||||
|
|
|
@ -204,7 +204,6 @@ struct byt_gpio {
|
||||||
struct platform_device *pdev;
|
struct platform_device *pdev;
|
||||||
struct pinctrl_dev *pctl_dev;
|
struct pinctrl_dev *pctl_dev;
|
||||||
struct pinctrl_desc pctl_desc;
|
struct pinctrl_desc pctl_desc;
|
||||||
raw_spinlock_t lock;
|
|
||||||
const struct byt_pinctrl_soc_data *soc_data;
|
const struct byt_pinctrl_soc_data *soc_data;
|
||||||
struct byt_community *communities_copy;
|
struct byt_community *communities_copy;
|
||||||
struct byt_gpio_pin_context *saved_context;
|
struct byt_gpio_pin_context *saved_context;
|
||||||
|
@ -715,6 +714,8 @@ static const struct byt_pinctrl_soc_data *byt_soc_data[] = {
|
||||||
NULL,
|
NULL,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static DEFINE_RAW_SPINLOCK(byt_lock);
|
||||||
|
|
||||||
static struct byt_community *byt_get_community(struct byt_gpio *vg,
|
static struct byt_community *byt_get_community(struct byt_gpio *vg,
|
||||||
unsigned int pin)
|
unsigned int pin)
|
||||||
{
|
{
|
||||||
|
@ -856,7 +857,7 @@ static void byt_set_group_simple_mux(struct byt_gpio *vg,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
for (i = 0; i < group.npins; i++) {
|
for (i = 0; i < group.npins; i++) {
|
||||||
void __iomem *padcfg0;
|
void __iomem *padcfg0;
|
||||||
|
@ -876,7 +877,7 @@ static void byt_set_group_simple_mux(struct byt_gpio *vg,
|
||||||
writel(value, padcfg0);
|
writel(value, padcfg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void byt_set_group_mixed_mux(struct byt_gpio *vg,
|
static void byt_set_group_mixed_mux(struct byt_gpio *vg,
|
||||||
|
@ -886,7 +887,7 @@ static void byt_set_group_mixed_mux(struct byt_gpio *vg,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
for (i = 0; i < group.npins; i++) {
|
for (i = 0; i < group.npins; i++) {
|
||||||
void __iomem *padcfg0;
|
void __iomem *padcfg0;
|
||||||
|
@ -906,7 +907,7 @@ static void byt_set_group_mixed_mux(struct byt_gpio *vg,
|
||||||
writel(value, padcfg0);
|
writel(value, padcfg0);
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int byt_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
|
static int byt_set_mux(struct pinctrl_dev *pctldev, unsigned int func_selector,
|
||||||
|
@ -955,11 +956,11 @@ static void byt_gpio_clear_triggering(struct byt_gpio *vg, unsigned int offset)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
value = readl(reg);
|
value = readl(reg);
|
||||||
value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
|
value &= ~(BYT_TRIG_POS | BYT_TRIG_NEG | BYT_TRIG_LVL);
|
||||||
writel(value, reg);
|
writel(value, reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev,
|
static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev,
|
||||||
|
@ -971,7 +972,7 @@ static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev,
|
||||||
u32 value, gpio_mux;
|
u32 value, gpio_mux;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* In most cases, func pin mux 000 means GPIO function.
|
* In most cases, func pin mux 000 means GPIO function.
|
||||||
|
@ -993,7 +994,7 @@ static int byt_gpio_request_enable(struct pinctrl_dev *pctl_dev,
|
||||||
"pin %u forcibly re-configured as GPIO\n", offset);
|
"pin %u forcibly re-configured as GPIO\n", offset);
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
pm_runtime_get(&vg->pdev->dev);
|
pm_runtime_get(&vg->pdev->dev);
|
||||||
|
|
||||||
|
@ -1021,7 +1022,7 @@ static int byt_gpio_set_direction(struct pinctrl_dev *pctl_dev,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
value = readl(val_reg);
|
value = readl(val_reg);
|
||||||
value &= ~BYT_DIR_MASK;
|
value &= ~BYT_DIR_MASK;
|
||||||
|
@ -1038,7 +1039,7 @@ static int byt_gpio_set_direction(struct pinctrl_dev *pctl_dev,
|
||||||
"Potential Error: Setting GPIO with direct_irq_en to output");
|
"Potential Error: Setting GPIO with direct_irq_en to output");
|
||||||
writel(value, val_reg);
|
writel(value, val_reg);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1107,11 +1108,11 @@ static int byt_pin_config_get(struct pinctrl_dev *pctl_dev, unsigned int offset,
|
||||||
u32 conf, pull, val, debounce;
|
u32 conf, pull, val, debounce;
|
||||||
u16 arg = 0;
|
u16 arg = 0;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
conf = readl(conf_reg);
|
conf = readl(conf_reg);
|
||||||
pull = conf & BYT_PULL_ASSIGN_MASK;
|
pull = conf & BYT_PULL_ASSIGN_MASK;
|
||||||
val = readl(val_reg);
|
val = readl(val_reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
switch (param) {
|
switch (param) {
|
||||||
case PIN_CONFIG_BIAS_DISABLE:
|
case PIN_CONFIG_BIAS_DISABLE:
|
||||||
|
@ -1138,9 +1139,9 @@ static int byt_pin_config_get(struct pinctrl_dev *pctl_dev, unsigned int offset,
|
||||||
if (!(conf & BYT_DEBOUNCE_EN))
|
if (!(conf & BYT_DEBOUNCE_EN))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
debounce = readl(db_reg);
|
debounce = readl(db_reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
switch (debounce & BYT_DEBOUNCE_PULSE_MASK) {
|
switch (debounce & BYT_DEBOUNCE_PULSE_MASK) {
|
||||||
case BYT_DEBOUNCE_PULSE_375US:
|
case BYT_DEBOUNCE_PULSE_375US:
|
||||||
|
@ -1192,7 +1193,7 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev,
|
||||||
u32 conf, val, debounce;
|
u32 conf, val, debounce;
|
||||||
int i, ret = 0;
|
int i, ret = 0;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
conf = readl(conf_reg);
|
conf = readl(conf_reg);
|
||||||
val = readl(val_reg);
|
val = readl(val_reg);
|
||||||
|
@ -1300,7 +1301,7 @@ static int byt_pin_config_set(struct pinctrl_dev *pctl_dev,
|
||||||
if (!ret)
|
if (!ret)
|
||||||
writel(conf, conf_reg);
|
writel(conf, conf_reg);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -1325,9 +1326,9 @@ static int byt_gpio_get(struct gpio_chip *chip, unsigned offset)
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
val = readl(reg);
|
val = readl(reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
return !!(val & BYT_LEVEL);
|
return !!(val & BYT_LEVEL);
|
||||||
}
|
}
|
||||||
|
@ -1342,13 +1343,13 @@ static void byt_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
|
||||||
if (!reg)
|
if (!reg)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
old_val = readl(reg);
|
old_val = readl(reg);
|
||||||
if (value)
|
if (value)
|
||||||
writel(old_val | BYT_LEVEL, reg);
|
writel(old_val | BYT_LEVEL, reg);
|
||||||
else
|
else
|
||||||
writel(old_val & ~BYT_LEVEL, reg);
|
writel(old_val & ~BYT_LEVEL, reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int byt_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
static int byt_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
||||||
|
@ -1361,9 +1362,9 @@ static int byt_gpio_get_direction(struct gpio_chip *chip, unsigned int offset)
|
||||||
if (!reg)
|
if (!reg)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
value = readl(reg);
|
value = readl(reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
if (!(value & BYT_OUTPUT_EN))
|
if (!(value & BYT_OUTPUT_EN))
|
||||||
return GPIOF_DIR_OUT;
|
return GPIOF_DIR_OUT;
|
||||||
|
@ -1406,14 +1407,14 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
||||||
const char *label;
|
const char *label;
|
||||||
unsigned int pin;
|
unsigned int pin;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
pin = vg->soc_data->pins[i].number;
|
pin = vg->soc_data->pins[i].number;
|
||||||
reg = byt_gpio_reg(vg, pin, BYT_CONF0_REG);
|
reg = byt_gpio_reg(vg, pin, BYT_CONF0_REG);
|
||||||
if (!reg) {
|
if (!reg) {
|
||||||
seq_printf(s,
|
seq_printf(s,
|
||||||
"Could not retrieve pin %i conf0 reg\n",
|
"Could not retrieve pin %i conf0 reg\n",
|
||||||
pin);
|
pin);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
conf0 = readl(reg);
|
conf0 = readl(reg);
|
||||||
|
@ -1422,11 +1423,11 @@ static void byt_gpio_dbg_show(struct seq_file *s, struct gpio_chip *chip)
|
||||||
if (!reg) {
|
if (!reg) {
|
||||||
seq_printf(s,
|
seq_printf(s,
|
||||||
"Could not retrieve pin %i val reg\n", pin);
|
"Could not retrieve pin %i val reg\n", pin);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
val = readl(reg);
|
val = readl(reg);
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
comm = byt_get_community(vg, pin);
|
comm = byt_get_community(vg, pin);
|
||||||
if (!comm) {
|
if (!comm) {
|
||||||
|
@ -1510,9 +1511,9 @@ static void byt_irq_ack(struct irq_data *d)
|
||||||
if (!reg)
|
if (!reg)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
raw_spin_lock(&vg->lock);
|
raw_spin_lock(&byt_lock);
|
||||||
writel(BIT(offset % 32), reg);
|
writel(BIT(offset % 32), reg);
|
||||||
raw_spin_unlock(&vg->lock);
|
raw_spin_unlock(&byt_lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void byt_irq_mask(struct irq_data *d)
|
static void byt_irq_mask(struct irq_data *d)
|
||||||
|
@ -1536,7 +1537,7 @@ static void byt_irq_unmask(struct irq_data *d)
|
||||||
if (!reg)
|
if (!reg)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
value = readl(reg);
|
value = readl(reg);
|
||||||
|
|
||||||
switch (irqd_get_trigger_type(d)) {
|
switch (irqd_get_trigger_type(d)) {
|
||||||
|
@ -1557,7 +1558,7 @@ static void byt_irq_unmask(struct irq_data *d)
|
||||||
|
|
||||||
writel(value, reg);
|
writel(value, reg);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int byt_irq_type(struct irq_data *d, unsigned int type)
|
static int byt_irq_type(struct irq_data *d, unsigned int type)
|
||||||
|
@ -1571,7 +1572,7 @@ static int byt_irq_type(struct irq_data *d, unsigned int type)
|
||||||
if (!reg || offset >= vg->chip.ngpio)
|
if (!reg || offset >= vg->chip.ngpio)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
raw_spin_lock_irqsave(&vg->lock, flags);
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
value = readl(reg);
|
value = readl(reg);
|
||||||
|
|
||||||
WARN(value & BYT_DIRECT_IRQ_EN,
|
WARN(value & BYT_DIRECT_IRQ_EN,
|
||||||
|
@ -1593,7 +1594,7 @@ static int byt_irq_type(struct irq_data *d, unsigned int type)
|
||||||
else if (type & IRQ_TYPE_LEVEL_MASK)
|
else if (type & IRQ_TYPE_LEVEL_MASK)
|
||||||
irq_set_handler_locked(d, handle_level_irq);
|
irq_set_handler_locked(d, handle_level_irq);
|
||||||
|
|
||||||
raw_spin_unlock_irqrestore(&vg->lock, flags);
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1629,9 +1630,9 @@ static void byt_gpio_irq_handler(struct irq_desc *desc)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_spin_lock(&vg->lock);
|
raw_spin_lock(&byt_lock);
|
||||||
pending = readl(reg);
|
pending = readl(reg);
|
||||||
raw_spin_unlock(&vg->lock);
|
raw_spin_unlock(&byt_lock);
|
||||||
for_each_set_bit(pin, &pending, 32) {
|
for_each_set_bit(pin, &pending, 32) {
|
||||||
virq = irq_find_mapping(vg->chip.irqdomain, base + pin);
|
virq = irq_find_mapping(vg->chip.irqdomain, base + pin);
|
||||||
generic_handle_irq(virq);
|
generic_handle_irq(virq);
|
||||||
|
@ -1833,8 +1834,6 @@ static int byt_pinctrl_probe(struct platform_device *pdev)
|
||||||
return PTR_ERR(vg->pctl_dev);
|
return PTR_ERR(vg->pctl_dev);
|
||||||
}
|
}
|
||||||
|
|
||||||
raw_spin_lock_init(&vg->lock);
|
|
||||||
|
|
||||||
ret = byt_gpio_probe(vg);
|
ret = byt_gpio_probe(vg);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
pinctrl_unregister(vg->pctl_dev);
|
pinctrl_unregister(vg->pctl_dev);
|
||||||
|
@ -1852,8 +1851,11 @@ static int byt_gpio_suspend(struct device *dev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct platform_device *pdev = to_platform_device(dev);
|
||||||
struct byt_gpio *vg = platform_get_drvdata(pdev);
|
struct byt_gpio *vg = platform_get_drvdata(pdev);
|
||||||
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
for (i = 0; i < vg->soc_data->npins; i++) {
|
for (i = 0; i < vg->soc_data->npins; i++) {
|
||||||
void __iomem *reg;
|
void __iomem *reg;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
@ -1874,6 +1876,7 @@ static int byt_gpio_suspend(struct device *dev)
|
||||||
vg->saved_context[i].val = value;
|
vg->saved_context[i].val = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1881,8 +1884,11 @@ static int byt_gpio_resume(struct device *dev)
|
||||||
{
|
{
|
||||||
struct platform_device *pdev = to_platform_device(dev);
|
struct platform_device *pdev = to_platform_device(dev);
|
||||||
struct byt_gpio *vg = platform_get_drvdata(pdev);
|
struct byt_gpio *vg = platform_get_drvdata(pdev);
|
||||||
|
unsigned long flags;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
raw_spin_lock_irqsave(&byt_lock, flags);
|
||||||
|
|
||||||
for (i = 0; i < vg->soc_data->npins; i++) {
|
for (i = 0; i < vg->soc_data->npins; i++) {
|
||||||
void __iomem *reg;
|
void __iomem *reg;
|
||||||
u32 value;
|
u32 value;
|
||||||
|
@ -1920,6 +1926,7 @@ static int byt_gpio_resume(struct device *dev)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
raw_spin_unlock_irqrestore(&byt_lock, flags);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1453,7 +1453,7 @@ static const struct pinmux_func pinmux_func_gpios[] = {
|
||||||
GPIO_FN(ET0_ETXD2_A),
|
GPIO_FN(ET0_ETXD2_A),
|
||||||
GPIO_FN(EX_CS5), GPIO_FN(SD1_CMD_A), GPIO_FN(ATADIR), GPIO_FN(QSSL_B),
|
GPIO_FN(EX_CS5), GPIO_FN(SD1_CMD_A), GPIO_FN(ATADIR), GPIO_FN(QSSL_B),
|
||||||
GPIO_FN(ET0_ETXD3_A),
|
GPIO_FN(ET0_ETXD3_A),
|
||||||
GPIO_FN(RD_WR), GPIO_FN(TCLK1_B),
|
GPIO_FN(RD_WR), GPIO_FN(TCLK0), GPIO_FN(CAN_CLK_B), GPIO_FN(ET0_ETXD4),
|
||||||
GPIO_FN(EX_WAIT0), GPIO_FN(TCLK1_B),
|
GPIO_FN(EX_WAIT0), GPIO_FN(TCLK1_B),
|
||||||
GPIO_FN(EX_WAIT1), GPIO_FN(SD1_DAT0_A), GPIO_FN(DREQ2),
|
GPIO_FN(EX_WAIT1), GPIO_FN(SD1_DAT0_A), GPIO_FN(DREQ2),
|
||||||
GPIO_FN(CAN1_TX_C), GPIO_FN(ET0_LINK_C), GPIO_FN(ET0_ETXD5_A),
|
GPIO_FN(CAN1_TX_C), GPIO_FN(ET0_LINK_C), GPIO_FN(ET0_ETXD5_A),
|
||||||
|
@ -1949,7 +1949,7 @@ static const struct pinmux_cfg_reg pinmux_config_regs[] = {
|
||||||
/* IP3_20 [1] */
|
/* IP3_20 [1] */
|
||||||
FN_EX_WAIT0, FN_TCLK1_B,
|
FN_EX_WAIT0, FN_TCLK1_B,
|
||||||
/* IP3_19_18 [2] */
|
/* IP3_19_18 [2] */
|
||||||
FN_RD_WR, FN_TCLK1_B, 0, 0,
|
FN_RD_WR, FN_TCLK0, FN_CAN_CLK_B, FN_ET0_ETXD4,
|
||||||
/* IP3_17_15 [3] */
|
/* IP3_17_15 [3] */
|
||||||
FN_EX_CS5, FN_SD1_CMD_A, FN_ATADIR, FN_QSSL_B,
|
FN_EX_CS5, FN_SD1_CMD_A, FN_ATADIR, FN_QSSL_B,
|
||||||
FN_ET0_ETXD3_A, 0, 0, 0,
|
FN_ET0_ETXD3_A, 0, 0, 0,
|
||||||
|
|
|
@ -308,7 +308,7 @@ static int __init hp_wmi_bios_2008_later(void)
|
||||||
|
|
||||||
static int __init hp_wmi_bios_2009_later(void)
|
static int __init hp_wmi_bios_2009_later(void)
|
||||||
{
|
{
|
||||||
int state = 0;
|
u8 state[128];
|
||||||
int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, 0, &state,
|
int ret = hp_wmi_perform_query(HPWMI_FEATURE2_QUERY, 0, &state,
|
||||||
sizeof(state), sizeof(state));
|
sizeof(state), sizeof(state));
|
||||||
if (!ret)
|
if (!ret)
|
||||||
|
|
|
@ -299,7 +299,10 @@ static int max8907_regulator_probe(struct platform_device *pdev)
|
||||||
memcpy(pmic->desc, max8907_regulators, sizeof(pmic->desc));
|
memcpy(pmic->desc, max8907_regulators, sizeof(pmic->desc));
|
||||||
|
|
||||||
/* Backwards compatibility with MAX8907B; SD1 uses different voltages */
|
/* Backwards compatibility with MAX8907B; SD1 uses different voltages */
|
||||||
regmap_read(max8907->regmap_gen, MAX8907_REG_II2RR, &val);
|
ret = regmap_read(max8907->regmap_gen, MAX8907_REG_II2RR, &val);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if ((val & MAX8907_II2RR_VERSION_MASK) ==
|
if ((val & MAX8907_II2RR_VERSION_MASK) ==
|
||||||
MAX8907_II2RR_VERSION_REV_B) {
|
MAX8907_II2RR_VERSION_REV_B) {
|
||||||
pmic->desc[MAX8907_SD1].min_uV = 637500;
|
pmic->desc[MAX8907_SD1].min_uV = 637500;
|
||||||
|
@ -336,14 +339,20 @@ static int max8907_regulator_probe(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pmic->desc[i].ops == &max8907_ldo_ops) {
|
if (pmic->desc[i].ops == &max8907_ldo_ops) {
|
||||||
regmap_read(config.regmap, pmic->desc[i].enable_reg,
|
ret = regmap_read(config.regmap, pmic->desc[i].enable_reg,
|
||||||
&val);
|
&val);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if ((val & MAX8907_MASK_LDO_SEQ) !=
|
if ((val & MAX8907_MASK_LDO_SEQ) !=
|
||||||
MAX8907_MASK_LDO_SEQ)
|
MAX8907_MASK_LDO_SEQ)
|
||||||
pmic->desc[i].ops = &max8907_ldo_hwctl_ops;
|
pmic->desc[i].ops = &max8907_ldo_hwctl_ops;
|
||||||
} else if (pmic->desc[i].ops == &max8907_out5v_ops) {
|
} else if (pmic->desc[i].ops == &max8907_out5v_ops) {
|
||||||
regmap_read(config.regmap, pmic->desc[i].enable_reg,
|
ret = regmap_read(config.regmap, pmic->desc[i].enable_reg,
|
||||||
&val);
|
&val);
|
||||||
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
|
||||||
if ((val & (MAX8907_MASK_OUT5V_VINEN |
|
if ((val & (MAX8907_MASK_OUT5V_VINEN |
|
||||||
MAX8907_MASK_OUT5V_ENSRC)) !=
|
MAX8907_MASK_OUT5V_ENSRC)) !=
|
||||||
MAX8907_MASK_OUT5V_ENSRC)
|
MAX8907_MASK_OUT5V_ENSRC)
|
||||||
|
|
|
@ -753,7 +753,7 @@ static int __init atari_scsi_probe(struct platform_device *pdev)
|
||||||
atari_scsi_template.sg_tablesize = SG_ALL;
|
atari_scsi_template.sg_tablesize = SG_ALL;
|
||||||
} else {
|
} else {
|
||||||
atari_scsi_template.can_queue = 1;
|
atari_scsi_template.can_queue = 1;
|
||||||
atari_scsi_template.sg_tablesize = SG_NONE;
|
atari_scsi_template.sg_tablesize = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (setup_can_queue > 0)
|
if (setup_can_queue > 0)
|
||||||
|
@ -762,8 +762,8 @@ static int __init atari_scsi_probe(struct platform_device *pdev)
|
||||||
if (setup_cmd_per_lun > 0)
|
if (setup_cmd_per_lun > 0)
|
||||||
atari_scsi_template.cmd_per_lun = setup_cmd_per_lun;
|
atari_scsi_template.cmd_per_lun = setup_cmd_per_lun;
|
||||||
|
|
||||||
/* Leave sg_tablesize at 0 on a Falcon! */
|
/* Don't increase sg_tablesize on Falcon! */
|
||||||
if (ATARIHW_PRESENT(TT_SCSI) && setup_sg_tablesize >= 0)
|
if (ATARIHW_PRESENT(TT_SCSI) && setup_sg_tablesize > 0)
|
||||||
atari_scsi_template.sg_tablesize = setup_sg_tablesize;
|
atari_scsi_template.sg_tablesize = setup_sg_tablesize;
|
||||||
|
|
||||||
if (setup_hostid >= 0) {
|
if (setup_hostid >= 0) {
|
||||||
|
|
|
@ -301,6 +301,7 @@ csio_ln_fdmi_rhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)
|
||||||
struct fc_fdmi_port_name *port_name;
|
struct fc_fdmi_port_name *port_name;
|
||||||
uint8_t buf[64];
|
uint8_t buf[64];
|
||||||
uint8_t *fc4_type;
|
uint8_t *fc4_type;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (fdmi_req->wr_status != FW_SUCCESS) {
|
if (fdmi_req->wr_status != FW_SUCCESS) {
|
||||||
csio_ln_dbg(ln, "WR error:%x in processing fdmi rhba cmd\n",
|
csio_ln_dbg(ln, "WR error:%x in processing fdmi rhba cmd\n",
|
||||||
|
@ -377,13 +378,13 @@ csio_ln_fdmi_rhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)
|
||||||
len = (uint32_t)(pld - (uint8_t *)cmd);
|
len = (uint32_t)(pld - (uint8_t *)cmd);
|
||||||
|
|
||||||
/* Submit FDMI RPA request */
|
/* Submit FDMI RPA request */
|
||||||
spin_lock_irq(&hw->lock);
|
spin_lock_irqsave(&hw->lock, flags);
|
||||||
if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_done,
|
if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_done,
|
||||||
FCOE_CT, &fdmi_req->dma_buf, len)) {
|
FCOE_CT, &fdmi_req->dma_buf, len)) {
|
||||||
CSIO_INC_STATS(ln, n_fdmi_err);
|
CSIO_INC_STATS(ln, n_fdmi_err);
|
||||||
csio_ln_dbg(ln, "Failed to issue fdmi rpa req\n");
|
csio_ln_dbg(ln, "Failed to issue fdmi rpa req\n");
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&hw->lock);
|
spin_unlock_irqrestore(&hw->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -404,6 +405,7 @@ csio_ln_fdmi_dprt_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)
|
||||||
struct fc_fdmi_rpl *reg_pl;
|
struct fc_fdmi_rpl *reg_pl;
|
||||||
struct fs_fdmi_attrs *attrib_blk;
|
struct fs_fdmi_attrs *attrib_blk;
|
||||||
uint8_t buf[64];
|
uint8_t buf[64];
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (fdmi_req->wr_status != FW_SUCCESS) {
|
if (fdmi_req->wr_status != FW_SUCCESS) {
|
||||||
csio_ln_dbg(ln, "WR error:%x in processing fdmi dprt cmd\n",
|
csio_ln_dbg(ln, "WR error:%x in processing fdmi dprt cmd\n",
|
||||||
|
@ -483,13 +485,13 @@ csio_ln_fdmi_dprt_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)
|
||||||
attrib_blk->numattrs = htonl(numattrs);
|
attrib_blk->numattrs = htonl(numattrs);
|
||||||
|
|
||||||
/* Submit FDMI RHBA request */
|
/* Submit FDMI RHBA request */
|
||||||
spin_lock_irq(&hw->lock);
|
spin_lock_irqsave(&hw->lock, flags);
|
||||||
if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_rhba_cbfn,
|
if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_rhba_cbfn,
|
||||||
FCOE_CT, &fdmi_req->dma_buf, len)) {
|
FCOE_CT, &fdmi_req->dma_buf, len)) {
|
||||||
CSIO_INC_STATS(ln, n_fdmi_err);
|
CSIO_INC_STATS(ln, n_fdmi_err);
|
||||||
csio_ln_dbg(ln, "Failed to issue fdmi rhba req\n");
|
csio_ln_dbg(ln, "Failed to issue fdmi rhba req\n");
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&hw->lock);
|
spin_unlock_irqrestore(&hw->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -504,6 +506,7 @@ csio_ln_fdmi_dhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)
|
||||||
void *cmd;
|
void *cmd;
|
||||||
struct fc_fdmi_port_name *port_name;
|
struct fc_fdmi_port_name *port_name;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
unsigned long flags;
|
||||||
|
|
||||||
if (fdmi_req->wr_status != FW_SUCCESS) {
|
if (fdmi_req->wr_status != FW_SUCCESS) {
|
||||||
csio_ln_dbg(ln, "WR error:%x in processing fdmi dhba cmd\n",
|
csio_ln_dbg(ln, "WR error:%x in processing fdmi dhba cmd\n",
|
||||||
|
@ -534,13 +537,13 @@ csio_ln_fdmi_dhba_cbfn(struct csio_hw *hw, struct csio_ioreq *fdmi_req)
|
||||||
len += sizeof(*port_name);
|
len += sizeof(*port_name);
|
||||||
|
|
||||||
/* Submit FDMI request */
|
/* Submit FDMI request */
|
||||||
spin_lock_irq(&hw->lock);
|
spin_lock_irqsave(&hw->lock, flags);
|
||||||
if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_dprt_cbfn,
|
if (csio_ln_mgmt_submit_req(fdmi_req, csio_ln_fdmi_dprt_cbfn,
|
||||||
FCOE_CT, &fdmi_req->dma_buf, len)) {
|
FCOE_CT, &fdmi_req->dma_buf, len)) {
|
||||||
CSIO_INC_STATS(ln, n_fdmi_err);
|
CSIO_INC_STATS(ln, n_fdmi_err);
|
||||||
csio_ln_dbg(ln, "Failed to issue fdmi dprt req\n");
|
csio_ln_dbg(ln, "Failed to issue fdmi dprt req\n");
|
||||||
}
|
}
|
||||||
spin_unlock_irq(&hw->lock);
|
spin_unlock_irqrestore(&hw->lock, flags);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -3863,7 +3863,7 @@ lpfc_cmpl_els_rsp(struct lpfc_hba *phba, struct lpfc_iocbq *cmdiocb,
|
||||||
mempool_free(mbox, phba->mbox_mem_pool);
|
mempool_free(mbox, phba->mbox_mem_pool);
|
||||||
}
|
}
|
||||||
out:
|
out:
|
||||||
if (ndlp && NLP_CHK_NODE_ACT(ndlp)) {
|
if (ndlp && NLP_CHK_NODE_ACT(ndlp) && shost) {
|
||||||
spin_lock_irq(shost->host_lock);
|
spin_lock_irq(shost->host_lock);
|
||||||
ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
|
ndlp->nlp_flag &= ~(NLP_ACC_REGLOGIN | NLP_RM_DFLT_RPI);
|
||||||
spin_unlock_irq(shost->host_lock);
|
spin_unlock_irq(shost->host_lock);
|
||||||
|
|
|
@ -454,8 +454,10 @@ lpfc_rcv_plogi(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
|
||||||
* single discovery thread, this will cause a huge delay in
|
* single discovery thread, this will cause a huge delay in
|
||||||
* discovery. Also this will cause multiple state machines
|
* discovery. Also this will cause multiple state machines
|
||||||
* running in parallel for this node.
|
* running in parallel for this node.
|
||||||
|
* This only applies to a fabric environment.
|
||||||
*/
|
*/
|
||||||
if (ndlp->nlp_state == NLP_STE_PLOGI_ISSUE) {
|
if ((ndlp->nlp_state == NLP_STE_PLOGI_ISSUE) &&
|
||||||
|
(vport->fc_flag & FC_FABRIC)) {
|
||||||
/* software abort outstanding PLOGI */
|
/* software abort outstanding PLOGI */
|
||||||
lpfc_els_abort(phba, ndlp);
|
lpfc_els_abort(phba, ndlp);
|
||||||
}
|
}
|
||||||
|
|
|
@ -11962,13 +11962,19 @@ send_current_mbox:
|
||||||
phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
|
phba->sli.sli_flag &= ~LPFC_SLI_MBOX_ACTIVE;
|
||||||
/* Setting active mailbox pointer need to be in sync to flag clear */
|
/* Setting active mailbox pointer need to be in sync to flag clear */
|
||||||
phba->sli.mbox_active = NULL;
|
phba->sli.mbox_active = NULL;
|
||||||
|
if (bf_get(lpfc_trailer_consumed, mcqe))
|
||||||
|
lpfc_sli4_mq_release(phba->sli4_hba.mbx_wq);
|
||||||
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||||
/* Wake up worker thread to post the next pending mailbox command */
|
/* Wake up worker thread to post the next pending mailbox command */
|
||||||
lpfc_worker_wake_up(phba);
|
lpfc_worker_wake_up(phba);
|
||||||
|
return workposted;
|
||||||
|
|
||||||
out_no_mqe_complete:
|
out_no_mqe_complete:
|
||||||
|
spin_lock_irqsave(&phba->hbalock, iflags);
|
||||||
if (bf_get(lpfc_trailer_consumed, mcqe))
|
if (bf_get(lpfc_trailer_consumed, mcqe))
|
||||||
lpfc_sli4_mq_release(phba->sli4_hba.mbx_wq);
|
lpfc_sli4_mq_release(phba->sli4_hba.mbx_wq);
|
||||||
return workposted;
|
spin_unlock_irqrestore(&phba->hbalock, iflags);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -15989,6 +15995,13 @@ lpfc_sli4_alloc_rpi(struct lpfc_hba *phba)
|
||||||
static void
|
static void
|
||||||
__lpfc_sli4_free_rpi(struct lpfc_hba *phba, int rpi)
|
__lpfc_sli4_free_rpi(struct lpfc_hba *phba, int rpi)
|
||||||
{
|
{
|
||||||
|
/*
|
||||||
|
* if the rpi value indicates a prior unreg has already
|
||||||
|
* been done, skip the unreg.
|
||||||
|
*/
|
||||||
|
if (rpi == LPFC_RPI_ALLOC_ERROR)
|
||||||
|
return;
|
||||||
|
|
||||||
if (test_and_clear_bit(rpi, phba->sli4_hba.rpi_bmask)) {
|
if (test_and_clear_bit(rpi, phba->sli4_hba.rpi_bmask)) {
|
||||||
phba->sli4_hba.rpi_count--;
|
phba->sli4_hba.rpi_count--;
|
||||||
phba->sli4_hba.max_cfg_param.rpi_used--;
|
phba->sli4_hba.max_cfg_param.rpi_used--;
|
||||||
|
|
|
@ -378,7 +378,7 @@ static int __init mac_scsi_probe(struct platform_device *pdev)
|
||||||
mac_scsi_template.can_queue = setup_can_queue;
|
mac_scsi_template.can_queue = setup_can_queue;
|
||||||
if (setup_cmd_per_lun > 0)
|
if (setup_cmd_per_lun > 0)
|
||||||
mac_scsi_template.cmd_per_lun = setup_cmd_per_lun;
|
mac_scsi_template.cmd_per_lun = setup_cmd_per_lun;
|
||||||
if (setup_sg_tablesize >= 0)
|
if (setup_sg_tablesize > 0)
|
||||||
mac_scsi_template.sg_tablesize = setup_sg_tablesize;
|
mac_scsi_template.sg_tablesize = setup_sg_tablesize;
|
||||||
if (setup_hostid >= 0)
|
if (setup_hostid >= 0)
|
||||||
mac_scsi_template.this_id = setup_hostid & 7;
|
mac_scsi_template.this_id = setup_hostid & 7;
|
||||||
|
|
|
@ -1465,7 +1465,8 @@ _ctl_diag_register_2(struct MPT3SAS_ADAPTER *ioc,
|
||||||
" for diag buffers, requested size(%d)\n",
|
" for diag buffers, requested size(%d)\n",
|
||||||
ioc->name, __func__, request_data_sz);
|
ioc->name, __func__, request_data_sz);
|
||||||
mpt3sas_base_free_smid(ioc, smid);
|
mpt3sas_base_free_smid(ioc, smid);
|
||||||
return -ENOMEM;
|
rc = -ENOMEM;
|
||||||
|
goto out;
|
||||||
}
|
}
|
||||||
ioc->diag_buffer[buffer_type] = request_data;
|
ioc->diag_buffer[buffer_type] = request_data;
|
||||||
ioc->diag_buffer_sz[buffer_type] = request_data_sz;
|
ioc->diag_buffer_sz[buffer_type] = request_data_sz;
|
||||||
|
|
|
@ -2368,6 +2368,8 @@ mpi_sata_completion(struct pm8001_hba_info *pm8001_ha, void *piomb)
|
||||||
pm8001_printk("task 0x%p done with io_status 0x%x"
|
pm8001_printk("task 0x%p done with io_status 0x%x"
|
||||||
" resp 0x%x stat 0x%x but aborted by upper layer!\n",
|
" resp 0x%x stat 0x%x but aborted by upper layer!\n",
|
||||||
t, status, ts->resp, ts->stat));
|
t, status, ts->resp, ts->stat));
|
||||||
|
if (t->slow_task)
|
||||||
|
complete(&t->slow_task->completion);
|
||||||
pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
|
pm8001_ccb_task_free(pm8001_ha, t, ccb, tag);
|
||||||
} else {
|
} else {
|
||||||
spin_unlock_irqrestore(&t->task_state_lock, flags);
|
spin_unlock_irqrestore(&t->task_state_lock, flags);
|
||||||
|
|
|
@ -4953,6 +4953,11 @@ static int __init scsi_debug_init(void)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sdebug_num_tgts < 0) {
|
||||||
|
pr_err("num_tgts must be >= 0\n");
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
if (sdebug_guard > 1) {
|
if (sdebug_guard > 1) {
|
||||||
pr_err("guard must be 0 or 1\n");
|
pr_err("guard must be 0 or 1\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -30,15 +30,18 @@ static const char *
|
||||||
scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len)
|
scsi_trace_rw6(struct trace_seq *p, unsigned char *cdb, int len)
|
||||||
{
|
{
|
||||||
const char *ret = trace_seq_buffer_ptr(p);
|
const char *ret = trace_seq_buffer_ptr(p);
|
||||||
sector_t lba = 0, txlen = 0;
|
u32 lba = 0, txlen;
|
||||||
|
|
||||||
lba |= ((cdb[1] & 0x1F) << 16);
|
lba |= ((cdb[1] & 0x1F) << 16);
|
||||||
lba |= (cdb[2] << 8);
|
lba |= (cdb[2] << 8);
|
||||||
lba |= cdb[3];
|
lba |= cdb[3];
|
||||||
txlen = cdb[4];
|
/*
|
||||||
|
* From SBC-2: a TRANSFER LENGTH field set to zero specifies that 256
|
||||||
|
* logical blocks shall be read (READ(6)) or written (WRITE(6)).
|
||||||
|
*/
|
||||||
|
txlen = cdb[4] ? cdb[4] : 256;
|
||||||
|
|
||||||
trace_seq_printf(p, "lba=%llu txlen=%llu",
|
trace_seq_printf(p, "lba=%u txlen=%u", lba, txlen);
|
||||||
(unsigned long long)lba, (unsigned long long)txlen);
|
|
||||||
trace_seq_putc(p, 0);
|
trace_seq_putc(p, 0);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
|
@ -419,7 +419,7 @@ static struct scsi_host_template sun3_scsi_template = {
|
||||||
.eh_bus_reset_handler = sun3scsi_bus_reset,
|
.eh_bus_reset_handler = sun3scsi_bus_reset,
|
||||||
.can_queue = 16,
|
.can_queue = 16,
|
||||||
.this_id = 7,
|
.this_id = 7,
|
||||||
.sg_tablesize = SG_NONE,
|
.sg_tablesize = 1,
|
||||||
.cmd_per_lun = 2,
|
.cmd_per_lun = 2,
|
||||||
.use_clustering = DISABLE_CLUSTERING,
|
.use_clustering = DISABLE_CLUSTERING,
|
||||||
.cmd_size = NCR5380_CMD_SIZE,
|
.cmd_size = NCR5380_CMD_SIZE,
|
||||||
|
@ -440,7 +440,7 @@ static int __init sun3_scsi_probe(struct platform_device *pdev)
|
||||||
sun3_scsi_template.can_queue = setup_can_queue;
|
sun3_scsi_template.can_queue = setup_can_queue;
|
||||||
if (setup_cmd_per_lun > 0)
|
if (setup_cmd_per_lun > 0)
|
||||||
sun3_scsi_template.cmd_per_lun = setup_cmd_per_lun;
|
sun3_scsi_template.cmd_per_lun = setup_cmd_per_lun;
|
||||||
if (setup_sg_tablesize >= 0)
|
if (setup_sg_tablesize > 0)
|
||||||
sun3_scsi_template.sg_tablesize = setup_sg_tablesize;
|
sun3_scsi_template.sg_tablesize = setup_sg_tablesize;
|
||||||
if (setup_hostid >= 0)
|
if (setup_hostid >= 0)
|
||||||
sun3_scsi_template.this_id = setup_hostid & 7;
|
sun3_scsi_template.this_id = setup_hostid & 7;
|
||||||
|
|
|
@ -2018,10 +2018,10 @@ static int __ufshcd_query_descriptor(struct ufs_hba *hba,
|
||||||
goto out_unlock;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
hba->dev_cmd.query.descriptor = NULL;
|
|
||||||
*buf_len = be16_to_cpu(response->upiu_res.length);
|
*buf_len = be16_to_cpu(response->upiu_res.length);
|
||||||
|
|
||||||
out_unlock:
|
out_unlock:
|
||||||
|
hba->dev_cmd.query.descriptor = NULL;
|
||||||
mutex_unlock(&hba->dev_cmd.lock);
|
mutex_unlock(&hba->dev_cmd.lock);
|
||||||
out:
|
out:
|
||||||
ufshcd_release(hba);
|
ufshcd_release(hba);
|
||||||
|
|
|
@ -673,6 +673,8 @@ static int img_spfi_probe(struct platform_device *pdev)
|
||||||
dma_release_channel(spfi->tx_ch);
|
dma_release_channel(spfi->tx_ch);
|
||||||
if (spfi->rx_ch)
|
if (spfi->rx_ch)
|
||||||
dma_release_channel(spfi->rx_ch);
|
dma_release_channel(spfi->rx_ch);
|
||||||
|
spfi->tx_ch = NULL;
|
||||||
|
spfi->rx_ch = NULL;
|
||||||
dev_warn(spfi->dev, "Failed to get DMA channels, falling back to PIO mode\n");
|
dev_warn(spfi->dev, "Failed to get DMA channels, falling back to PIO mode\n");
|
||||||
} else {
|
} else {
|
||||||
master->dma_tx = spfi->tx_ch;
|
master->dma_tx = spfi->tx_ch;
|
||||||
|
|
|
@ -1529,7 +1529,13 @@ pxa2xx_spi_init_pdata(struct platform_device *pdev)
|
||||||
}
|
}
|
||||||
|
|
||||||
ssp->clk = devm_clk_get(&pdev->dev, NULL);
|
ssp->clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
|
if (IS_ERR(ssp->clk))
|
||||||
|
return NULL;
|
||||||
|
|
||||||
ssp->irq = platform_get_irq(pdev, 0);
|
ssp->irq = platform_get_irq(pdev, 0);
|
||||||
|
if (ssp->irq < 0)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
ssp->type = type;
|
ssp->type = type;
|
||||||
ssp->pdev = pdev;
|
ssp->pdev = pdev;
|
||||||
ssp->port_id = pxa2xx_spi_get_port_id(adev);
|
ssp->port_id = pxa2xx_spi_get_port_id(adev);
|
||||||
|
|
|
@ -385,6 +385,7 @@ static int spi_st_probe(struct platform_device *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
clk_disable:
|
clk_disable:
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
clk_disable_unprepare(spi_st->clk);
|
clk_disable_unprepare(spi_st->clk);
|
||||||
put_master:
|
put_master:
|
||||||
spi_master_put(master);
|
spi_master_put(master);
|
||||||
|
@ -396,6 +397,8 @@ static int spi_st_remove(struct platform_device *pdev)
|
||||||
struct spi_master *master = platform_get_drvdata(pdev);
|
struct spi_master *master = platform_get_drvdata(pdev);
|
||||||
struct spi_st *spi_st = spi_master_get_devdata(master);
|
struct spi_st *spi_st = spi_master_get_devdata(master);
|
||||||
|
|
||||||
|
pm_runtime_disable(&pdev->dev);
|
||||||
|
|
||||||
clk_disable_unprepare(spi_st->clk);
|
clk_disable_unprepare(spi_st->clk);
|
||||||
|
|
||||||
pinctrl_pm_select_sleep_state(&pdev->dev);
|
pinctrl_pm_select_sleep_state(&pdev->dev);
|
||||||
|
|
|
@ -1078,7 +1078,7 @@ static int tegra_slink_probe(struct platform_device *pdev)
|
||||||
ret = clk_enable(tspi->clk);
|
ret = clk_enable(tspi->clk);
|
||||||
if (ret < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "Clock enable failed %d\n", ret);
|
dev_err(&pdev->dev, "Clock enable failed %d\n", ret);
|
||||||
goto exit_free_master;
|
goto exit_clk_unprepare;
|
||||||
}
|
}
|
||||||
|
|
||||||
spi_irq = platform_get_irq(pdev, 0);
|
spi_irq = platform_get_irq(pdev, 0);
|
||||||
|
@ -1151,6 +1151,8 @@ exit_free_irq:
|
||||||
free_irq(spi_irq, tspi);
|
free_irq(spi_irq, tspi);
|
||||||
exit_clk_disable:
|
exit_clk_disable:
|
||||||
clk_disable(tspi->clk);
|
clk_disable(tspi->clk);
|
||||||
|
exit_clk_unprepare:
|
||||||
|
clk_unprepare(tspi->clk);
|
||||||
exit_free_master:
|
exit_free_master:
|
||||||
spi_master_put(master);
|
spi_master_put(master);
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -1164,6 +1166,7 @@ static int tegra_slink_remove(struct platform_device *pdev)
|
||||||
free_irq(tspi->irq, tspi);
|
free_irq(tspi->irq, tspi);
|
||||||
|
|
||||||
clk_disable(tspi->clk);
|
clk_disable(tspi->clk);
|
||||||
|
clk_unprepare(tspi->clk);
|
||||||
|
|
||||||
if (tspi->tx_dma_chan)
|
if (tspi->tx_dma_chan)
|
||||||
tegra_slink_deinit_dma_param(tspi, false);
|
tegra_slink_deinit_dma_param(tspi, false);
|
||||||
|
|
|
@ -663,6 +663,9 @@ static int spidev_release(struct inode *inode, struct file *filp)
|
||||||
if (dofree)
|
if (dofree)
|
||||||
kfree(spidev);
|
kfree(spidev);
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_SPI_SLAVE
|
||||||
|
spi_slave_abort(spidev->spi);
|
||||||
|
#endif
|
||||||
mutex_unlock(&device_list_lock);
|
mutex_unlock(&device_list_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -632,6 +632,11 @@ static int gsc_hpdi_auto_attach(struct comedi_device *dev,
|
||||||
dma_alloc_coherent(&pcidev->dev, DMA_BUFFER_SIZE,
|
dma_alloc_coherent(&pcidev->dev, DMA_BUFFER_SIZE,
|
||||||
&devpriv->dio_buffer_phys_addr[i],
|
&devpriv->dio_buffer_phys_addr[i],
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
if (!devpriv->dio_buffer[i]) {
|
||||||
|
dev_warn(dev->class_dev,
|
||||||
|
"failed to allocate DMA buffer\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/* allocate dma descriptors */
|
/* allocate dma descriptors */
|
||||||
devpriv->dma_desc = dma_alloc_coherent(&pcidev->dev,
|
devpriv->dma_desc = dma_alloc_coherent(&pcidev->dev,
|
||||||
|
@ -639,6 +644,11 @@ static int gsc_hpdi_auto_attach(struct comedi_device *dev,
|
||||||
NUM_DMA_DESCRIPTORS,
|
NUM_DMA_DESCRIPTORS,
|
||||||
&devpriv->dma_desc_phys_addr,
|
&devpriv->dma_desc_phys_addr,
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
|
if (!devpriv->dma_desc) {
|
||||||
|
dev_warn(dev->class_dev,
|
||||||
|
"failed to allocate DMA descriptors\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
if (devpriv->dma_desc_phys_addr & 0xf) {
|
if (devpriv->dma_desc_phys_addr & 0xf) {
|
||||||
dev_warn(dev->class_dev,
|
dev_warn(dev->class_dev,
|
||||||
" dma descriptors not quad-word aligned (bug)\n");
|
" dma descriptors not quad-word aligned (bug)\n");
|
||||||
|
|
|
@ -766,7 +766,7 @@ struct fb_info *fbtft_framebuffer_alloc(struct fbtft_display *display,
|
||||||
fbdefio->deferred_io = fbtft_deferred_io;
|
fbdefio->deferred_io = fbtft_deferred_io;
|
||||||
fb_deferred_io_init(info);
|
fb_deferred_io_init(info);
|
||||||
|
|
||||||
strncpy(info->fix.id, dev->driver->name, 16);
|
snprintf(info->fix.id, sizeof(info->fix.id), "%s", dev->driver->name);
|
||||||
info->fix.type = FB_TYPE_PACKED_PIXELS;
|
info->fix.type = FB_TYPE_PACKED_PIXELS;
|
||||||
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
info->fix.visual = FB_VISUAL_TRUECOLOR;
|
||||||
info->fix.xpanstep = 0;
|
info->fix.xpanstep = 0;
|
||||||
|
|
|
@ -805,7 +805,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
|
||||||
memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
|
memcpy(pwlanhdr->addr2, get_bssid(pmlmepriv), ETH_ALEN);
|
||||||
memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
|
memcpy(pwlanhdr->addr3, pattrib->src, ETH_ALEN);
|
||||||
|
|
||||||
if (psta->qos_option)
|
if (psta && psta->qos_option)
|
||||||
qos_option = true;
|
qos_option = true;
|
||||||
} else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
|
} else if (check_fwstate(pmlmepriv, WIFI_ADHOC_STATE) ||
|
||||||
check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
|
check_fwstate(pmlmepriv, WIFI_ADHOC_MASTER_STATE)) {
|
||||||
|
@ -813,7 +813,7 @@ s32 rtw_make_wlanhdr(struct adapter *padapter, u8 *hdr, struct pkt_attrib *pattr
|
||||||
memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
|
memcpy(pwlanhdr->addr2, pattrib->src, ETH_ALEN);
|
||||||
memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
|
memcpy(pwlanhdr->addr3, get_bssid(pmlmepriv), ETH_ALEN);
|
||||||
|
|
||||||
if (psta->qos_option)
|
if (psta && psta->qos_option)
|
||||||
qos_option = true;
|
qos_option = true;
|
||||||
} else {
|
} else {
|
||||||
RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv)));
|
RT_TRACE(_module_rtl871x_xmit_c_, _drv_err_, ("fw_state:%x is not allowed to xmit frame\n", get_fwstate(pmlmepriv)));
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue