mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-10 12:57:06 +09:00
Merge tag 'v4.9.156' of git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux-stable into odroidn2-4.9.y
This is the 4.9.156 stable release
This commit is contained in:
2
Makefile
2
Makefile
@@ -1,6 +1,6 @@
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 9
|
||||
SUBLEVEL = 155
|
||||
SUBLEVEL = 156
|
||||
EXTRAVERSION =
|
||||
NAME = Roaring Lionus
|
||||
|
||||
|
||||
@@ -220,12 +220,15 @@
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
twsi2: i2c@d4025000 {
|
||||
twsi2: i2c@d4031000 {
|
||||
compatible = "mrvl,mmp-twsi";
|
||||
reg = <0xd4025000 0x1000>;
|
||||
interrupts = <58>;
|
||||
reg = <0xd4031000 0x1000>;
|
||||
interrupt-parent = <&intcmux17>;
|
||||
interrupts = <0>;
|
||||
clocks = <&soc_clocks MMP2_CLK_TWSI1>;
|
||||
resets = <&soc_clocks MMP2_CLK_TWSI1>;
|
||||
#address-cells = <1>;
|
||||
#size-cells = <0>;
|
||||
status = "disabled";
|
||||
};
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
gpio = <&gpio2 16 GPIO_ACTIVE_HIGH>; /* gpio line 48 */
|
||||
enable-active-high;
|
||||
regulator-boot-on;
|
||||
startup-delay-us = <25000>;
|
||||
};
|
||||
|
||||
vbat: fixedregulator-vbat {
|
||||
|
||||
@@ -713,6 +713,21 @@ void smp_send_stop(void)
|
||||
pr_warn("SMP: failed to stop secondary CPUs\n");
|
||||
}
|
||||
|
||||
/* In case panic() and panic() called at the same time on CPU1 and CPU2,
|
||||
* and CPU 1 calls panic_smp_self_stop() before crash_smp_send_stop()
|
||||
* CPU1 can't receive the ipi irqs from CPU2, CPU1 will be always online,
|
||||
* kdump fails. So split out the panic_smp_self_stop() and add
|
||||
* set_cpu_online(smp_processor_id(), false).
|
||||
*/
|
||||
void panic_smp_self_stop(void)
|
||||
{
|
||||
pr_debug("CPU %u will stop doing anything useful since another CPU has paniced\n",
|
||||
smp_processor_id());
|
||||
set_cpu_online(smp_processor_id(), false);
|
||||
while (1)
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
/*
|
||||
* not supported here
|
||||
*/
|
||||
|
||||
@@ -117,6 +117,12 @@ int kvm_handle_mmio_return(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||
vcpu_set_reg(vcpu, vcpu->arch.mmio_decode.rt, data);
|
||||
}
|
||||
|
||||
/*
|
||||
* The MMIO instruction is emulated and should not be re-executed
|
||||
* in the guest.
|
||||
*/
|
||||
kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -144,11 +150,6 @@ static int decode_hsr(struct kvm_vcpu *vcpu, bool *is_write, int *len)
|
||||
vcpu->arch.mmio_decode.sign_extend = sign_extend;
|
||||
vcpu->arch.mmio_decode.rt = rt;
|
||||
|
||||
/*
|
||||
* The MMIO instruction is emulated and should not be re-executed
|
||||
* in the guest.
|
||||
*/
|
||||
kvm_skip_instr(vcpu, kvm_vcpu_trap_il_is32bit(vcpu));
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -2551,7 +2551,7 @@ static int __init _init(struct omap_hwmod *oh, void *data)
|
||||
* a stub; implementing this properly requires iclk autoidle usecounting in
|
||||
* the clock code. No return value.
|
||||
*/
|
||||
static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
|
||||
static void _setup_iclk_autoidle(struct omap_hwmod *oh)
|
||||
{
|
||||
struct omap_hwmod_ocp_if *os;
|
||||
struct list_head *p;
|
||||
@@ -2586,7 +2586,7 @@ static void __init _setup_iclk_autoidle(struct omap_hwmod *oh)
|
||||
* reset. Returns 0 upon success or a negative error code upon
|
||||
* failure.
|
||||
*/
|
||||
static int __init _setup_reset(struct omap_hwmod *oh)
|
||||
static int _setup_reset(struct omap_hwmod *oh)
|
||||
{
|
||||
int r;
|
||||
|
||||
@@ -2647,7 +2647,7 @@ static int __init _setup_reset(struct omap_hwmod *oh)
|
||||
*
|
||||
* No return value.
|
||||
*/
|
||||
static void __init _setup_postsetup(struct omap_hwmod *oh)
|
||||
static void _setup_postsetup(struct omap_hwmod *oh)
|
||||
{
|
||||
u8 postsetup_state;
|
||||
|
||||
|
||||
@@ -547,7 +547,7 @@ static struct pxa3xx_u2d_platform_data cm_x300_u2d_platform_data = {
|
||||
.exit = cm_x300_u2d_exit,
|
||||
};
|
||||
|
||||
static void cm_x300_init_u2d(void)
|
||||
static void __init cm_x300_init_u2d(void)
|
||||
{
|
||||
pxa3xx_set_u2d_info(&cm_x300_u2d_platform_data);
|
||||
}
|
||||
|
||||
@@ -183,7 +183,7 @@ static struct pxafb_mach_info littleton_lcd_info = {
|
||||
.lcd_conn = LCD_COLOR_TFT_16BPP,
|
||||
};
|
||||
|
||||
static void littleton_init_lcd(void)
|
||||
static void __init littleton_init_lcd(void)
|
||||
{
|
||||
pxa_set_fb_info(NULL, &littleton_lcd_info);
|
||||
}
|
||||
|
||||
@@ -557,7 +557,7 @@ static struct pxaohci_platform_data zeus_ohci_platform_data = {
|
||||
.flags = ENABLE_PORT_ALL | POWER_SENSE_LOW,
|
||||
};
|
||||
|
||||
static void zeus_register_ohci(void)
|
||||
static void __init zeus_register_ohci(void)
|
||||
{
|
||||
/* Port 2 is shared between host and client interface. */
|
||||
UP2OCR = UP2OCR_HXOE | UP2OCR_HXS | UP2OCR_DMPDE | UP2OCR_DPPDE;
|
||||
|
||||
@@ -78,7 +78,6 @@
|
||||
.macro mcount_get_lr reg
|
||||
ldr \reg, [x29]
|
||||
ldr \reg, [\reg, #8]
|
||||
mcount_adjust_addr \reg, \reg
|
||||
.endm
|
||||
|
||||
.macro mcount_get_lr_addr reg
|
||||
|
||||
@@ -361,8 +361,8 @@ enum mm_32a_minor_op {
|
||||
mm_ext_op = 0x02c,
|
||||
mm_pool32axf_op = 0x03c,
|
||||
mm_srl32_op = 0x040,
|
||||
mm_srlv32_op = 0x050,
|
||||
mm_sra_op = 0x080,
|
||||
mm_srlv32_op = 0x090,
|
||||
mm_rotr_op = 0x0c0,
|
||||
mm_lwxs_op = 0x118,
|
||||
mm_addu32_op = 0x150,
|
||||
|
||||
@@ -38,6 +38,7 @@ choice
|
||||
|
||||
config SOC_MT7620
|
||||
bool "MT7620/8"
|
||||
select CPU_MIPSR2_IRQ_VI
|
||||
select HW_HAS_PCI
|
||||
|
||||
config SOC_MT7621
|
||||
|
||||
@@ -59,7 +59,7 @@
|
||||
#endif
|
||||
|
||||
#define access_ok(type, addr, size) \
|
||||
(__chk_user_ptr(addr), \
|
||||
(__chk_user_ptr(addr), (void)(type), \
|
||||
__access_ok((__force unsigned long)(addr), (size), get_fs()))
|
||||
|
||||
/*
|
||||
|
||||
@@ -288,6 +288,8 @@ int dlpar_detach_node(struct device_node *dn)
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
of_node_put(dn);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -197,12 +197,17 @@ static inline pte_t pte_mkold(pte_t pte)
|
||||
|
||||
static inline pte_t pte_wrprotect(pte_t pte)
|
||||
{
|
||||
pte_clear_bits(pte, _PAGE_RW);
|
||||
if (likely(pte_get_bits(pte, _PAGE_RW)))
|
||||
pte_clear_bits(pte, _PAGE_RW);
|
||||
else
|
||||
return pte;
|
||||
return(pte_mknewprot(pte));
|
||||
}
|
||||
|
||||
static inline pte_t pte_mkread(pte_t pte)
|
||||
{
|
||||
if (unlikely(pte_get_bits(pte, _PAGE_USER)))
|
||||
return pte;
|
||||
pte_set_bits(pte, _PAGE_USER);
|
||||
return(pte_mknewprot(pte));
|
||||
}
|
||||
@@ -221,6 +226,8 @@ static inline pte_t pte_mkyoung(pte_t pte)
|
||||
|
||||
static inline pte_t pte_mkwrite(pte_t pte)
|
||||
{
|
||||
if (unlikely(pte_get_bits(pte, _PAGE_RW)))
|
||||
return pte;
|
||||
pte_set_bits(pte, _PAGE_RW);
|
||||
return(pte_mknewprot(pte));
|
||||
}
|
||||
|
||||
@@ -3234,6 +3234,11 @@ static void free_excl_cntrs(int cpu)
|
||||
}
|
||||
|
||||
static void intel_pmu_cpu_dying(int cpu)
|
||||
{
|
||||
fini_debug_store_on_cpu(cpu);
|
||||
}
|
||||
|
||||
static void intel_pmu_cpu_dead(int cpu)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &per_cpu(cpu_hw_events, cpu);
|
||||
struct intel_shared_regs *pc;
|
||||
@@ -3246,8 +3251,6 @@ static void intel_pmu_cpu_dying(int cpu)
|
||||
}
|
||||
|
||||
free_excl_cntrs(cpu);
|
||||
|
||||
fini_debug_store_on_cpu(cpu);
|
||||
}
|
||||
|
||||
static void intel_pmu_sched_task(struct perf_event_context *ctx,
|
||||
@@ -3324,6 +3327,7 @@ static __initconst const struct x86_pmu core_pmu = {
|
||||
.cpu_prepare = intel_pmu_cpu_prepare,
|
||||
.cpu_starting = intel_pmu_cpu_starting,
|
||||
.cpu_dying = intel_pmu_cpu_dying,
|
||||
.cpu_dead = intel_pmu_cpu_dead,
|
||||
};
|
||||
|
||||
static __initconst const struct x86_pmu intel_pmu = {
|
||||
@@ -3359,6 +3363,8 @@ static __initconst const struct x86_pmu intel_pmu = {
|
||||
.cpu_prepare = intel_pmu_cpu_prepare,
|
||||
.cpu_starting = intel_pmu_cpu_starting,
|
||||
.cpu_dying = intel_pmu_cpu_dying,
|
||||
.cpu_dead = intel_pmu_cpu_dead,
|
||||
|
||||
.guest_get_msrs = intel_guest_get_msrs,
|
||||
.sched_task = intel_pmu_sched_task,
|
||||
};
|
||||
|
||||
@@ -1221,6 +1221,8 @@ static struct pci_driver snbep_uncore_pci_driver = {
|
||||
.id_table = snbep_uncore_pci_ids,
|
||||
};
|
||||
|
||||
#define NODE_ID_MASK 0x7
|
||||
|
||||
/*
|
||||
* build pci bus to socket mapping
|
||||
*/
|
||||
@@ -1242,7 +1244,7 @@ static int snbep_pci2phy_map_init(int devid, int nodeid_loc, int idmap_loc, bool
|
||||
err = pci_read_config_dword(ubox_dev, nodeid_loc, &config);
|
||||
if (err)
|
||||
break;
|
||||
nodeid = config;
|
||||
nodeid = config & NODE_ID_MASK;
|
||||
/* get the Node ID mapping */
|
||||
err = pci_read_config_dword(ubox_dev, idmap_loc, &config);
|
||||
if (err)
|
||||
|
||||
@@ -97,6 +97,9 @@ extern void fpstate_sanitize_xstate(struct fpu *fpu);
|
||||
#define user_insn(insn, output, input...) \
|
||||
({ \
|
||||
int err; \
|
||||
\
|
||||
might_fault(); \
|
||||
\
|
||||
asm volatile(ASM_STAC "\n" \
|
||||
"1:" #insn "\n\t" \
|
||||
"2: " ASM_CLAC "\n" \
|
||||
|
||||
@@ -751,6 +751,7 @@ static int mce_no_way_out(struct mce *m, char **msg, unsigned long *validp,
|
||||
quirk_no_way_out(i, m, regs);
|
||||
|
||||
if (mce_severity(m, mca_cfg.tolerant, &tmp, true) >= MCE_PANIC_SEVERITY) {
|
||||
m->bank = i;
|
||||
mce_read_aux(m, i);
|
||||
*msg = tmp;
|
||||
return 1;
|
||||
|
||||
@@ -5223,6 +5223,13 @@ static bool svm_cpu_has_accelerated_tpr(void)
|
||||
|
||||
static bool svm_has_emulated_msr(int index)
|
||||
{
|
||||
switch (index) {
|
||||
case MSR_IA32_MCG_EXT_CTL:
|
||||
return false;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@@ -7368,6 +7368,7 @@ static void free_nested(struct vcpu_vmx *vmx)
|
||||
if (!vmx->nested.vmxon)
|
||||
return;
|
||||
|
||||
hrtimer_cancel(&vmx->nested.preemption_timer);
|
||||
vmx->nested.vmxon = false;
|
||||
free_vpid(vmx->nested.vpid02);
|
||||
nested_release_vmcs12(vmx);
|
||||
|
||||
@@ -4513,6 +4513,13 @@ int kvm_read_guest_virt(struct kvm_vcpu *vcpu,
|
||||
{
|
||||
u32 access = (kvm_x86_ops->get_cpl(vcpu) == 3) ? PFERR_USER_MASK : 0;
|
||||
|
||||
/*
|
||||
* FIXME: this should call handle_emulation_failure if X86EMUL_IO_NEEDED
|
||||
* is returned, but our callers are not ready for that and they blindly
|
||||
* call kvm_inject_page_fault. Ensure that they at least do not leak
|
||||
* uninitialized kernel stack memory into cr2 and error code.
|
||||
*/
|
||||
memset(exception, 0, sizeof(*exception));
|
||||
return kvm_read_guest_virt_helper(addr, val, bytes, vcpu, access,
|
||||
exception);
|
||||
}
|
||||
|
||||
@@ -50,8 +50,8 @@ static void __init cnb20le_res(u8 bus, u8 slot, u8 func)
|
||||
word1 = read_pci_config_16(bus, slot, func, 0xc0);
|
||||
word2 = read_pci_config_16(bus, slot, func, 0xc2);
|
||||
if (word1 != word2) {
|
||||
res.start = (word1 << 16) | 0x0000;
|
||||
res.end = (word2 << 16) | 0xffff;
|
||||
res.start = ((resource_size_t) word1 << 16) | 0x0000;
|
||||
res.end = ((resource_size_t) word2 << 16) | 0xffff;
|
||||
res.flags = IORESOURCE_MEM;
|
||||
update_res(info, res.start, res.end, res.flags, 0);
|
||||
}
|
||||
|
||||
@@ -872,7 +872,9 @@ static int sata_rcar_probe(struct platform_device *pdev)
|
||||
int ret = 0;
|
||||
|
||||
irq = platform_get_irq(pdev, 0);
|
||||
if (irq <= 0)
|
||||
if (irq < 0)
|
||||
return irq;
|
||||
if (!irq)
|
||||
return -EINVAL;
|
||||
|
||||
priv = devm_kzalloc(&pdev->dev, sizeof(struct sata_rcar_priv),
|
||||
|
||||
@@ -668,14 +668,15 @@ drbd_set_role(struct drbd_device *const device, enum drbd_role new_role, int for
|
||||
if (rv == SS_TWO_PRIMARIES) {
|
||||
/* Maybe the peer is detected as dead very soon...
|
||||
retry at most once more in this case. */
|
||||
int timeo;
|
||||
rcu_read_lock();
|
||||
nc = rcu_dereference(connection->net_conf);
|
||||
timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1;
|
||||
rcu_read_unlock();
|
||||
schedule_timeout_interruptible(timeo);
|
||||
if (try < max_tries)
|
||||
if (try < max_tries) {
|
||||
int timeo;
|
||||
try = max_tries - 1;
|
||||
rcu_read_lock();
|
||||
nc = rcu_dereference(connection->net_conf);
|
||||
timeo = nc ? (nc->ping_timeo + 1) * HZ / 10 : 1;
|
||||
rcu_read_unlock();
|
||||
schedule_timeout_interruptible(timeo);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (rv < SS_SUCCESS) {
|
||||
|
||||
@@ -3421,7 +3421,7 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,
|
||||
enum drbd_conns rv = C_MASK;
|
||||
enum drbd_disk_state mydisk;
|
||||
struct net_conf *nc;
|
||||
int hg, rule_nr, rr_conflict, tentative;
|
||||
int hg, rule_nr, rr_conflict, tentative, always_asbp;
|
||||
|
||||
mydisk = device->state.disk;
|
||||
if (mydisk == D_NEGOTIATING)
|
||||
@@ -3472,8 +3472,12 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,
|
||||
|
||||
rcu_read_lock();
|
||||
nc = rcu_dereference(peer_device->connection->net_conf);
|
||||
always_asbp = nc->always_asbp;
|
||||
rr_conflict = nc->rr_conflict;
|
||||
tentative = nc->tentative;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (hg == 100 || (hg == -100 && nc->always_asbp)) {
|
||||
if (hg == 100 || (hg == -100 && always_asbp)) {
|
||||
int pcount = (device->state.role == R_PRIMARY)
|
||||
+ (peer_role == R_PRIMARY);
|
||||
int forced = (hg == -100);
|
||||
@@ -3512,9 +3516,6 @@ static enum drbd_conns drbd_sync_handshake(struct drbd_peer_device *peer_device,
|
||||
"Sync from %s node\n",
|
||||
(hg < 0) ? "peer" : "this");
|
||||
}
|
||||
rr_conflict = nc->rr_conflict;
|
||||
tentative = nc->tentative;
|
||||
rcu_read_unlock();
|
||||
|
||||
if (hg == -100) {
|
||||
/* FIXME this log message is not correct if we end up here
|
||||
@@ -4198,7 +4199,7 @@ static int receive_uuids(struct drbd_connection *connection, struct packet_info
|
||||
kfree(device->p_uuid);
|
||||
device->p_uuid = p_uuid;
|
||||
|
||||
if (device->state.conn < C_CONNECTED &&
|
||||
if ((device->state.conn < C_CONNECTED || device->state.pdsk == D_DISKLESS) &&
|
||||
device->state.disk < D_INCONSISTENT &&
|
||||
device->state.role == R_PRIMARY &&
|
||||
(device->ed_uuid & ~((u64)1)) != (p_uuid[UI_CURRENT] & ~((u64)1))) {
|
||||
|
||||
@@ -40,6 +40,8 @@ MODULE_VERSION(DRV_MODULE_VERSION);
|
||||
#define WAITING_FOR_GEN_CMD 0x04
|
||||
#define WAITING_FOR_ANY -1
|
||||
|
||||
#define VDC_MAX_RETRIES 10
|
||||
|
||||
static struct workqueue_struct *sunvdc_wq;
|
||||
|
||||
struct vdc_req_entry {
|
||||
@@ -419,6 +421,7 @@ static int __vdc_tx_trigger(struct vdc_port *port)
|
||||
.end_idx = dr->prod,
|
||||
};
|
||||
int err, delay;
|
||||
int retries = 0;
|
||||
|
||||
hdr.seq = dr->snd_nxt;
|
||||
delay = 1;
|
||||
@@ -431,6 +434,8 @@ static int __vdc_tx_trigger(struct vdc_port *port)
|
||||
udelay(delay);
|
||||
if ((delay <<= 1) > 128)
|
||||
delay = 128;
|
||||
if (retries++ > VDC_MAX_RETRIES)
|
||||
break;
|
||||
} while (err == -EAGAIN);
|
||||
|
||||
if (err == -ENOTCONN)
|
||||
|
||||
@@ -1027,7 +1027,11 @@ static void floppy_release(struct gendisk *disk, fmode_t mode)
|
||||
struct swim3 __iomem *sw = fs->swim3;
|
||||
|
||||
mutex_lock(&swim3_mutex);
|
||||
if (fs->ref_count > 0 && --fs->ref_count == 0) {
|
||||
if (fs->ref_count > 0)
|
||||
--fs->ref_count;
|
||||
else if (fs->ref_count == -1)
|
||||
fs->ref_count = 0;
|
||||
if (fs->ref_count == 0) {
|
||||
swim3_action(fs, MOTOR_OFF);
|
||||
out_8(&sw->control_bic, 0xff);
|
||||
swim3_select(fs, RELAX);
|
||||
|
||||
@@ -882,6 +882,7 @@ static void __exit exit_gdrom(void)
|
||||
platform_device_unregister(pd);
|
||||
platform_driver_unregister(&gdrom_driver);
|
||||
kfree(gd.toc);
|
||||
kfree(gd.cd_info);
|
||||
}
|
||||
|
||||
module_init(init_gdrom);
|
||||
|
||||
@@ -17,6 +17,8 @@
|
||||
|
||||
#include "clk.h"
|
||||
|
||||
#define CCDR 0x4
|
||||
#define BM_CCM_CCDR_MMDC_CH0_MASK (1 << 17)
|
||||
#define CCSR 0xc
|
||||
#define BM_CCSR_PLL1_SW_CLK_SEL (1 << 2)
|
||||
#define CACRR 0x10
|
||||
@@ -414,6 +416,10 @@ static void __init imx6sl_clocks_init(struct device_node *ccm_node)
|
||||
clks[IMX6SL_CLK_USDHC3] = imx_clk_gate2("usdhc3", "usdhc3_podf", base + 0x80, 6);
|
||||
clks[IMX6SL_CLK_USDHC4] = imx_clk_gate2("usdhc4", "usdhc4_podf", base + 0x80, 8);
|
||||
|
||||
/* Ensure the MMDC CH0 handshake is bypassed */
|
||||
writel_relaxed(readl_relaxed(base + CCDR) |
|
||||
BM_CCM_CCDR_MMDC_CH0_MASK, base + CCDR);
|
||||
|
||||
imx_check_clocks(clks, ARRAY_SIZE(clks));
|
||||
|
||||
clk_data.clks = clks;
|
||||
|
||||
@@ -362,10 +362,10 @@ static SUNXI_CCU_MP_WITH_MUX_GATE(spi1_clk, "spi1", mod0_default_parents, 0x0a4,
|
||||
static const char * const i2s_parents[] = { "pll-audio-8x", "pll-audio-4x",
|
||||
"pll-audio-2x", "pll-audio" };
|
||||
static SUNXI_CCU_MUX_WITH_GATE(i2s0_clk, "i2s0", i2s_parents,
|
||||
0x0b0, 16, 2, BIT(31), 0);
|
||||
0x0b0, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
|
||||
|
||||
static SUNXI_CCU_MUX_WITH_GATE(i2s1_clk, "i2s1", i2s_parents,
|
||||
0x0b4, 16, 2, BIT(31), 0);
|
||||
0x0b4, 16, 2, BIT(31), CLK_SET_RATE_PARENT);
|
||||
|
||||
/* TODO: the parent for most of the USB clocks is not known */
|
||||
static SUNXI_CCU_GATE(usb_phy0_clk, "usb-phy0", "osc24M",
|
||||
@@ -442,7 +442,7 @@ static SUNXI_CCU_M_WITH_GATE(ve_clk, "ve", "pll-ve",
|
||||
static SUNXI_CCU_GATE(ac_dig_clk, "ac-dig", "pll-audio",
|
||||
0x140, BIT(31), 0);
|
||||
static SUNXI_CCU_GATE(ac_dig_4x_clk, "ac-dig-4x", "pll-audio-4x",
|
||||
0x140, BIT(30), 0);
|
||||
0x140, BIT(30), CLK_SET_RATE_PARENT);
|
||||
static SUNXI_CCU_GATE(avs_clk, "avs", "osc24M",
|
||||
0x144, BIT(31), 0);
|
||||
|
||||
|
||||
@@ -167,6 +167,7 @@ static int __init bl_idle_init(void)
|
||||
{
|
||||
int ret;
|
||||
struct device_node *root = of_find_node_by_path("/");
|
||||
const struct of_device_id *match_id;
|
||||
|
||||
if (!root)
|
||||
return -ENODEV;
|
||||
@@ -174,7 +175,11 @@ static int __init bl_idle_init(void)
|
||||
/*
|
||||
* Initialize the driver just for a compliant set of machines
|
||||
*/
|
||||
if (!of_match_node(compatible_machine_match, root))
|
||||
match_id = of_match_node(compatible_machine_match, root);
|
||||
|
||||
of_node_put(root);
|
||||
|
||||
if (!match_id)
|
||||
return -ENODEV;
|
||||
|
||||
if (!mcpm_is_available())
|
||||
|
||||
@@ -555,7 +555,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx,
|
||||
desc = dmaengine_prep_slave_sg(channel,
|
||||
ctx->device->dma.sg_src,
|
||||
ctx->device->dma.sg_src_len,
|
||||
direction, DMA_CTRL_ACK);
|
||||
DMA_MEM_TO_DEV, DMA_CTRL_ACK);
|
||||
break;
|
||||
|
||||
case DMA_FROM_DEVICE:
|
||||
@@ -579,7 +579,7 @@ static int cryp_set_dma_transfer(struct cryp_ctx *ctx,
|
||||
desc = dmaengine_prep_slave_sg(channel,
|
||||
ctx->device->dma.sg_dst,
|
||||
ctx->device->dma.sg_dst_len,
|
||||
direction,
|
||||
DMA_DEV_TO_MEM,
|
||||
DMA_CTRL_ACK |
|
||||
DMA_PREP_INTERRUPT);
|
||||
|
||||
|
||||
@@ -165,7 +165,7 @@ static int hash_set_dma_transfer(struct hash_ctx *ctx, struct scatterlist *sg,
|
||||
__func__);
|
||||
desc = dmaengine_prep_slave_sg(channel,
|
||||
ctx->device->dma.sg, ctx->device->dma.sg_len,
|
||||
direction, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
|
||||
DMA_MEM_TO_DEV, DMA_CTRL_ACK | DMA_PREP_INTERRUPT);
|
||||
if (!desc) {
|
||||
dev_err(ctx->device->dev,
|
||||
"%s: dmaengine_prep_slave_sg() failed!\n", __func__);
|
||||
|
||||
@@ -415,38 +415,32 @@ static void bcm2835_dma_fill_cb_chain_with_sg(
|
||||
}
|
||||
}
|
||||
|
||||
static int bcm2835_dma_abort(void __iomem *chan_base)
|
||||
static int bcm2835_dma_abort(struct bcm2835_chan *c)
|
||||
{
|
||||
unsigned long cs;
|
||||
void __iomem *chan_base = c->chan_base;
|
||||
long int timeout = 10000;
|
||||
|
||||
cs = readl(chan_base + BCM2835_DMA_CS);
|
||||
if (!(cs & BCM2835_DMA_ACTIVE))
|
||||
/*
|
||||
* A zero control block address means the channel is idle.
|
||||
* (The ACTIVE flag in the CS register is not a reliable indicator.)
|
||||
*/
|
||||
if (!readl(chan_base + BCM2835_DMA_ADDR))
|
||||
return 0;
|
||||
|
||||
/* Write 0 to the active bit - Pause the DMA */
|
||||
writel(0, chan_base + BCM2835_DMA_CS);
|
||||
|
||||
/* Wait for any current AXI transfer to complete */
|
||||
while ((cs & BCM2835_DMA_ISPAUSED) && --timeout) {
|
||||
while ((readl(chan_base + BCM2835_DMA_CS) &
|
||||
BCM2835_DMA_WAITING_FOR_WRITES) && --timeout)
|
||||
cpu_relax();
|
||||
cs = readl(chan_base + BCM2835_DMA_CS);
|
||||
}
|
||||
|
||||
/* We'll un-pause when we set of our next DMA */
|
||||
/* Peripheral might be stuck and fail to signal AXI write responses */
|
||||
if (!timeout)
|
||||
return -ETIMEDOUT;
|
||||
|
||||
if (!(cs & BCM2835_DMA_ACTIVE))
|
||||
return 0;
|
||||
|
||||
/* Terminate the control block chain */
|
||||
writel(0, chan_base + BCM2835_DMA_NEXTCB);
|
||||
|
||||
/* Abort the whole DMA */
|
||||
writel(BCM2835_DMA_ABORT | BCM2835_DMA_ACTIVE,
|
||||
chan_base + BCM2835_DMA_CS);
|
||||
dev_err(c->vc.chan.device->dev,
|
||||
"failed to complete outstanding writes\n");
|
||||
|
||||
writel(BCM2835_DMA_RESET, chan_base + BCM2835_DMA_CS);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -485,8 +479,15 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *data)
|
||||
|
||||
spin_lock_irqsave(&c->vc.lock, flags);
|
||||
|
||||
/* Acknowledge interrupt */
|
||||
writel(BCM2835_DMA_INT, c->chan_base + BCM2835_DMA_CS);
|
||||
/*
|
||||
* Clear the INT flag to receive further interrupts. Keep the channel
|
||||
* active in case the descriptor is cyclic or in case the client has
|
||||
* already terminated the descriptor and issued a new one. (May happen
|
||||
* if this IRQ handler is threaded.) If the channel is finished, it
|
||||
* will remain idle despite the ACTIVE flag being set.
|
||||
*/
|
||||
writel(BCM2835_DMA_INT | BCM2835_DMA_ACTIVE,
|
||||
c->chan_base + BCM2835_DMA_CS);
|
||||
|
||||
d = c->desc;
|
||||
|
||||
@@ -494,11 +495,7 @@ static irqreturn_t bcm2835_dma_callback(int irq, void *data)
|
||||
if (d->cyclic) {
|
||||
/* call the cyclic callback */
|
||||
vchan_cyclic_callback(&d->vd);
|
||||
|
||||
/* Keep the DMA engine running */
|
||||
writel(BCM2835_DMA_ACTIVE,
|
||||
c->chan_base + BCM2835_DMA_CS);
|
||||
} else {
|
||||
} else if (!readl(c->chan_base + BCM2835_DMA_ADDR)) {
|
||||
vchan_cookie_complete(&c->desc->vd);
|
||||
bcm2835_dma_start_desc(c);
|
||||
}
|
||||
@@ -796,7 +793,6 @@ static int bcm2835_dma_terminate_all(struct dma_chan *chan)
|
||||
struct bcm2835_chan *c = to_bcm2835_dma_chan(chan);
|
||||
struct bcm2835_dmadev *d = to_bcm2835_dma_dev(c->vc.chan.device);
|
||||
unsigned long flags;
|
||||
int timeout = 10000;
|
||||
LIST_HEAD(head);
|
||||
|
||||
spin_lock_irqsave(&c->vc.lock, flags);
|
||||
@@ -806,27 +802,11 @@ static int bcm2835_dma_terminate_all(struct dma_chan *chan)
|
||||
list_del_init(&c->node);
|
||||
spin_unlock(&d->lock);
|
||||
|
||||
/*
|
||||
* Stop DMA activity: we assume the callback will not be called
|
||||
* after bcm_dma_abort() returns (even if it does, it will see
|
||||
* c->desc is NULL and exit.)
|
||||
*/
|
||||
/* stop DMA activity */
|
||||
if (c->desc) {
|
||||
bcm2835_dma_desc_free(&c->desc->vd);
|
||||
c->desc = NULL;
|
||||
bcm2835_dma_abort(c->chan_base);
|
||||
|
||||
/* Wait for stopping */
|
||||
while (--timeout) {
|
||||
if (!(readl(c->chan_base + BCM2835_DMA_CS) &
|
||||
BCM2835_DMA_ACTIVE))
|
||||
break;
|
||||
|
||||
cpu_relax();
|
||||
}
|
||||
|
||||
if (!timeout)
|
||||
dev_err(d->ddev.dev, "DMA transfer could not be terminated\n");
|
||||
bcm2835_dma_abort(c);
|
||||
}
|
||||
|
||||
vchan_get_all_descriptors(&c->vc, &head);
|
||||
|
||||
@@ -623,7 +623,7 @@ static void imxdma_tasklet(unsigned long data)
|
||||
{
|
||||
struct imxdma_channel *imxdmac = (void *)data;
|
||||
struct imxdma_engine *imxdma = imxdmac->imxdma;
|
||||
struct imxdma_desc *desc;
|
||||
struct imxdma_desc *desc, *next_desc;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&imxdma->lock, flags);
|
||||
@@ -653,10 +653,10 @@ static void imxdma_tasklet(unsigned long data)
|
||||
list_move_tail(imxdmac->ld_active.next, &imxdmac->ld_free);
|
||||
|
||||
if (!list_empty(&imxdmac->ld_queue)) {
|
||||
desc = list_first_entry(&imxdmac->ld_queue, struct imxdma_desc,
|
||||
node);
|
||||
next_desc = list_first_entry(&imxdmac->ld_queue,
|
||||
struct imxdma_desc, node);
|
||||
list_move_tail(imxdmac->ld_queue.next, &imxdmac->ld_active);
|
||||
if (imxdma_xfer_desc(desc) < 0)
|
||||
if (imxdma_xfer_desc(next_desc) < 0)
|
||||
dev_warn(imxdma->dev, "%s: channel: %d couldn't xfer desc\n",
|
||||
__func__, imxdmac->channel);
|
||||
}
|
||||
|
||||
@@ -159,7 +159,7 @@ struct zynqmp_dma_desc_ll {
|
||||
u32 ctrl;
|
||||
u64 nxtdscraddr;
|
||||
u64 rsvd;
|
||||
}; __aligned(64)
|
||||
};
|
||||
|
||||
/**
|
||||
* struct zynqmp_dma_desc_sw - Per Transaction structure
|
||||
|
||||
@@ -318,7 +318,12 @@ EXPORT_SYMBOL_GPL(efivar_variable_is_removable);
|
||||
static efi_status_t
|
||||
check_var_size(u32 attributes, unsigned long size)
|
||||
{
|
||||
const struct efivar_operations *fops = __efivars->ops;
|
||||
const struct efivar_operations *fops;
|
||||
|
||||
if (!__efivars)
|
||||
return EFI_UNSUPPORTED;
|
||||
|
||||
fops = __efivars->ops;
|
||||
|
||||
if (!fops->query_variable_store)
|
||||
return EFI_UNSUPPORTED;
|
||||
@@ -329,7 +334,12 @@ check_var_size(u32 attributes, unsigned long size)
|
||||
static efi_status_t
|
||||
check_var_size_nonblocking(u32 attributes, unsigned long size)
|
||||
{
|
||||
const struct efivar_operations *fops = __efivars->ops;
|
||||
const struct efivar_operations *fops;
|
||||
|
||||
if (!__efivars)
|
||||
return EFI_UNSUPPORTED;
|
||||
|
||||
fops = __efivars->ops;
|
||||
|
||||
if (!fops->query_variable_store)
|
||||
return EFI_UNSUPPORTED;
|
||||
@@ -429,13 +439,18 @@ static void dup_variable_bug(efi_char16_t *str16, efi_guid_t *vendor_guid,
|
||||
int efivar_init(int (*func)(efi_char16_t *, efi_guid_t, unsigned long, void *),
|
||||
void *data, bool duplicates, struct list_head *head)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
unsigned long variable_name_size = 1024;
|
||||
efi_char16_t *variable_name;
|
||||
efi_status_t status;
|
||||
efi_guid_t vendor_guid;
|
||||
int err = 0;
|
||||
|
||||
if (!__efivars)
|
||||
return -EFAULT;
|
||||
|
||||
ops = __efivars->ops;
|
||||
|
||||
variable_name = kzalloc(variable_name_size, GFP_KERNEL);
|
||||
if (!variable_name) {
|
||||
printk(KERN_ERR "efivars: Memory allocation failed.\n");
|
||||
@@ -583,12 +598,14 @@ static void efivar_entry_list_del_unlock(struct efivar_entry *entry)
|
||||
*/
|
||||
int __efivar_entry_delete(struct efivar_entry *entry)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
efi_status_t status;
|
||||
|
||||
status = ops->set_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
0, 0, NULL);
|
||||
if (!__efivars)
|
||||
return -EINVAL;
|
||||
|
||||
status = __efivars->ops->set_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
0, 0, NULL);
|
||||
|
||||
return efi_status_to_err(status);
|
||||
}
|
||||
@@ -607,12 +624,17 @@ EXPORT_SYMBOL_GPL(__efivar_entry_delete);
|
||||
*/
|
||||
int efivar_entry_delete(struct efivar_entry *entry)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
efi_status_t status;
|
||||
|
||||
if (down_interruptible(&efivars_lock))
|
||||
return -EINTR;
|
||||
|
||||
if (!__efivars) {
|
||||
up(&efivars_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
ops = __efivars->ops;
|
||||
status = ops->set_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
0, 0, NULL);
|
||||
@@ -650,13 +672,19 @@ EXPORT_SYMBOL_GPL(efivar_entry_delete);
|
||||
int efivar_entry_set(struct efivar_entry *entry, u32 attributes,
|
||||
unsigned long size, void *data, struct list_head *head)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
efi_status_t status;
|
||||
efi_char16_t *name = entry->var.VariableName;
|
||||
efi_guid_t vendor = entry->var.VendorGuid;
|
||||
|
||||
if (down_interruptible(&efivars_lock))
|
||||
return -EINTR;
|
||||
|
||||
if (!__efivars) {
|
||||
up(&efivars_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
ops = __efivars->ops;
|
||||
if (head && efivar_entry_find(name, vendor, head, false)) {
|
||||
up(&efivars_lock);
|
||||
return -EEXIST;
|
||||
@@ -687,12 +715,17 @@ static int
|
||||
efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor,
|
||||
u32 attributes, unsigned long size, void *data)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
efi_status_t status;
|
||||
|
||||
if (down_trylock(&efivars_lock))
|
||||
return -EBUSY;
|
||||
|
||||
if (!__efivars) {
|
||||
up(&efivars_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
status = check_var_size_nonblocking(attributes,
|
||||
size + ucs2_strsize(name, 1024));
|
||||
if (status != EFI_SUCCESS) {
|
||||
@@ -700,6 +733,7 @@ efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor,
|
||||
return -ENOSPC;
|
||||
}
|
||||
|
||||
ops = __efivars->ops;
|
||||
status = ops->set_variable_nonblocking(name, &vendor, attributes,
|
||||
size, data);
|
||||
|
||||
@@ -727,9 +761,13 @@ efivar_entry_set_nonblocking(efi_char16_t *name, efi_guid_t vendor,
|
||||
int efivar_entry_set_safe(efi_char16_t *name, efi_guid_t vendor, u32 attributes,
|
||||
bool block, unsigned long size, void *data)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
efi_status_t status;
|
||||
|
||||
if (!__efivars)
|
||||
return -EINVAL;
|
||||
|
||||
ops = __efivars->ops;
|
||||
if (!ops->query_variable_store)
|
||||
return -ENOSYS;
|
||||
|
||||
@@ -829,13 +867,18 @@ EXPORT_SYMBOL_GPL(efivar_entry_find);
|
||||
*/
|
||||
int efivar_entry_size(struct efivar_entry *entry, unsigned long *size)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
efi_status_t status;
|
||||
|
||||
*size = 0;
|
||||
|
||||
if (down_interruptible(&efivars_lock))
|
||||
return -EINTR;
|
||||
if (!__efivars) {
|
||||
up(&efivars_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
ops = __efivars->ops;
|
||||
status = ops->get_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid, NULL, size, NULL);
|
||||
up(&efivars_lock);
|
||||
@@ -861,12 +904,14 @@ EXPORT_SYMBOL_GPL(efivar_entry_size);
|
||||
int __efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
|
||||
unsigned long *size, void *data)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
efi_status_t status;
|
||||
|
||||
status = ops->get_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
attributes, size, data);
|
||||
if (!__efivars)
|
||||
return -EINVAL;
|
||||
|
||||
status = __efivars->ops->get_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
attributes, size, data);
|
||||
|
||||
return efi_status_to_err(status);
|
||||
}
|
||||
@@ -882,14 +927,19 @@ EXPORT_SYMBOL_GPL(__efivar_entry_get);
|
||||
int efivar_entry_get(struct efivar_entry *entry, u32 *attributes,
|
||||
unsigned long *size, void *data)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
efi_status_t status;
|
||||
|
||||
if (down_interruptible(&efivars_lock))
|
||||
return -EINTR;
|
||||
status = ops->get_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
attributes, size, data);
|
||||
|
||||
if (!__efivars) {
|
||||
up(&efivars_lock);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
status = __efivars->ops->get_variable(entry->var.VariableName,
|
||||
&entry->var.VendorGuid,
|
||||
attributes, size, data);
|
||||
up(&efivars_lock);
|
||||
|
||||
return efi_status_to_err(status);
|
||||
@@ -921,7 +971,7 @@ EXPORT_SYMBOL_GPL(efivar_entry_get);
|
||||
int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
||||
unsigned long *size, void *data, bool *set)
|
||||
{
|
||||
const struct efivar_operations *ops = __efivars->ops;
|
||||
const struct efivar_operations *ops;
|
||||
efi_char16_t *name = entry->var.VariableName;
|
||||
efi_guid_t *vendor = &entry->var.VendorGuid;
|
||||
efi_status_t status;
|
||||
@@ -940,6 +990,11 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
||||
if (down_interruptible(&efivars_lock))
|
||||
return -EINTR;
|
||||
|
||||
if (!__efivars) {
|
||||
err = -EINVAL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* Ensure that the available space hasn't shrunk below the safe level
|
||||
*/
|
||||
@@ -956,6 +1011,8 @@ int efivar_entry_set_get_size(struct efivar_entry *entry, u32 attributes,
|
||||
}
|
||||
}
|
||||
|
||||
ops = __efivars->ops;
|
||||
|
||||
status = ops->set_variable(name, vendor, attributes, *size, data);
|
||||
if (status != EFI_SUCCESS) {
|
||||
err = efi_status_to_err(status);
|
||||
|
||||
@@ -36,6 +36,8 @@
|
||||
#include <drm/drmP.h>
|
||||
#include "drm_legacy.h"
|
||||
|
||||
#include <linux/nospec.h>
|
||||
|
||||
static struct drm_map_list *drm_find_matching_map(struct drm_device *dev,
|
||||
struct drm_local_map *map)
|
||||
{
|
||||
@@ -1413,6 +1415,7 @@ int drm_legacy_freebufs(struct drm_device *dev, void *data,
|
||||
idx, dma->buf_count - 1);
|
||||
return -EINVAL;
|
||||
}
|
||||
idx = array_index_nospec(idx, dma->buf_count);
|
||||
buf = dma->buflist[idx];
|
||||
if (buf->file_priv != file_priv) {
|
||||
DRM_ERROR("Process %d freeing buffer not owned\n",
|
||||
|
||||
@@ -345,12 +345,14 @@ static int vc4_plane_setup_clipping_and_scaling(struct drm_plane_state *state)
|
||||
vc4_get_scaling_mode(vc4_state->src_h[1],
|
||||
vc4_state->crtc_h);
|
||||
|
||||
/* YUV conversion requires that horizontal scaling be enabled,
|
||||
* even on a plane that's otherwise 1:1. Looks like only PPF
|
||||
* works in that case, so let's pick that one.
|
||||
/* YUV conversion requires that horizontal scaling be enabled
|
||||
* on the UV plane even if vc4_get_scaling_mode() returned
|
||||
* VC4_SCALING_NONE (which can happen when the down-scaling
|
||||
* ratio is 0.5). Let's force it to VC4_SCALING_PPF in this
|
||||
* case.
|
||||
*/
|
||||
if (vc4_state->is_unity)
|
||||
vc4_state->x_scaling[0] = VC4_SCALING_PPF;
|
||||
if (vc4_state->x_scaling[1] == VC4_SCALING_NONE)
|
||||
vc4_state->x_scaling[1] = VC4_SCALING_PPF;
|
||||
} else {
|
||||
vc4_state->is_yuv = false;
|
||||
vc4_state->x_scaling[1] = VC4_SCALING_NONE;
|
||||
|
||||
@@ -1513,7 +1513,7 @@ unlock:
|
||||
EXPORT_SYMBOL_GPL(ipu_image_convert_queue);
|
||||
|
||||
/* Abort any active or pending conversions for this context */
|
||||
void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
|
||||
static void __ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
|
||||
{
|
||||
struct ipu_image_convert_chan *chan = ctx->chan;
|
||||
struct ipu_image_convert_priv *priv = chan->priv;
|
||||
@@ -1540,7 +1540,7 @@ void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
|
||||
|
||||
need_abort = (run_count || active_run);
|
||||
|
||||
ctx->aborting = need_abort;
|
||||
ctx->aborting = true;
|
||||
|
||||
spin_unlock_irqrestore(&chan->irqlock, flags);
|
||||
|
||||
@@ -1561,7 +1561,11 @@ void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
|
||||
dev_warn(priv->ipu->dev, "%s: timeout\n", __func__);
|
||||
force_abort(ctx);
|
||||
}
|
||||
}
|
||||
|
||||
void ipu_image_convert_abort(struct ipu_image_convert_ctx *ctx)
|
||||
{
|
||||
__ipu_image_convert_abort(ctx);
|
||||
ctx->aborting = false;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(ipu_image_convert_abort);
|
||||
@@ -1575,7 +1579,7 @@ void ipu_image_convert_unprepare(struct ipu_image_convert_ctx *ctx)
|
||||
bool put_res;
|
||||
|
||||
/* make sure no runs are hanging around */
|
||||
ipu_image_convert_abort(ctx);
|
||||
__ipu_image_convert_abort(ctx);
|
||||
|
||||
dev_dbg(priv->ipu->dev, "%s: task %u: removing ctx %p\n", __func__,
|
||||
chan->ic_task, ctx);
|
||||
|
||||
@@ -713,7 +713,9 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
|
||||
data_pointer->led_mute.brightness_get = lenovo_led_brightness_get_tpkbd;
|
||||
data_pointer->led_mute.brightness_set = lenovo_led_brightness_set_tpkbd;
|
||||
data_pointer->led_mute.dev = dev;
|
||||
led_classdev_register(dev, &data_pointer->led_mute);
|
||||
ret = led_classdev_register(dev, &data_pointer->led_mute);
|
||||
if (ret < 0)
|
||||
goto err;
|
||||
|
||||
data_pointer->led_micmute.name = name_micmute;
|
||||
data_pointer->led_micmute.brightness_get =
|
||||
@@ -721,7 +723,11 @@ static int lenovo_probe_tpkbd(struct hid_device *hdev)
|
||||
data_pointer->led_micmute.brightness_set =
|
||||
lenovo_led_brightness_set_tpkbd;
|
||||
data_pointer->led_micmute.dev = dev;
|
||||
led_classdev_register(dev, &data_pointer->led_micmute);
|
||||
ret = led_classdev_register(dev, &data_pointer->led_micmute);
|
||||
if (ret < 0) {
|
||||
led_classdev_unregister(&data_pointer->led_mute);
|
||||
goto err;
|
||||
}
|
||||
|
||||
lenovo_features_set_tpkbd(hdev);
|
||||
|
||||
|
||||
@@ -360,9 +360,11 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
|
||||
struct i2c_client *client = data->client;
|
||||
unsigned long min, val;
|
||||
u8 reg;
|
||||
int err = kstrtoul(buf, 10, &val);
|
||||
if (err < 0)
|
||||
return err;
|
||||
int rv;
|
||||
|
||||
rv = kstrtoul(buf, 10, &val);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
|
||||
/* Save fan_min */
|
||||
mutex_lock(&data->update_lock);
|
||||
@@ -390,8 +392,11 @@ static ssize_t set_fan_div(struct device *dev, struct device_attribute *attr,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
reg = (lm80_read_value(client, LM80_REG_FANDIV) &
|
||||
~(3 << (2 * (nr + 1)))) | (data->fan_div[nr] << (2 * (nr + 1)));
|
||||
rv = lm80_read_value(client, LM80_REG_FANDIV);
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
reg = (rv & ~(3 << (2 * (nr + 1))))
|
||||
| (data->fan_div[nr] << (2 * (nr + 1)));
|
||||
lm80_write_value(client, LM80_REG_FANDIV, reg);
|
||||
|
||||
/* Restore fan_min */
|
||||
@@ -623,6 +628,7 @@ static int lm80_probe(struct i2c_client *client,
|
||||
struct device *dev = &client->dev;
|
||||
struct device *hwmon_dev;
|
||||
struct lm80_data *data;
|
||||
int rv;
|
||||
|
||||
data = devm_kzalloc(dev, sizeof(struct lm80_data), GFP_KERNEL);
|
||||
if (!data)
|
||||
@@ -635,8 +641,14 @@ static int lm80_probe(struct i2c_client *client,
|
||||
lm80_init_client(client);
|
||||
|
||||
/* A few vars need to be filled upon startup */
|
||||
data->fan[f_min][0] = lm80_read_value(client, LM80_REG_FAN_MIN(1));
|
||||
data->fan[f_min][1] = lm80_read_value(client, LM80_REG_FAN_MIN(2));
|
||||
rv = lm80_read_value(client, LM80_REG_FAN_MIN(1));
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
data->fan[f_min][0] = rv;
|
||||
rv = lm80_read_value(client, LM80_REG_FAN_MIN(2));
|
||||
if (rv < 0)
|
||||
return rv;
|
||||
data->fan[f_min][1] = rv;
|
||||
|
||||
hwmon_dev = devm_hwmon_device_register_with_groups(dev, client->name,
|
||||
data, lm80_groups);
|
||||
|
||||
@@ -296,22 +296,7 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
|
||||
i2c_int_disable(idev, MST_STATUS_TFL);
|
||||
}
|
||||
|
||||
if (status & MST_STATUS_SCC) {
|
||||
/* Stop completed */
|
||||
i2c_int_disable(idev, ~MST_STATUS_TSS);
|
||||
complete(&idev->msg_complete);
|
||||
} else if (status & MST_STATUS_SNS) {
|
||||
/* Transfer done */
|
||||
i2c_int_disable(idev, ~MST_STATUS_TSS);
|
||||
if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
|
||||
axxia_i2c_empty_rx_fifo(idev);
|
||||
complete(&idev->msg_complete);
|
||||
} else if (status & MST_STATUS_TSS) {
|
||||
/* Transfer timeout */
|
||||
idev->msg_err = -ETIMEDOUT;
|
||||
i2c_int_disable(idev, ~MST_STATUS_TSS);
|
||||
complete(&idev->msg_complete);
|
||||
} else if (unlikely(status & MST_STATUS_ERR)) {
|
||||
if (unlikely(status & MST_STATUS_ERR)) {
|
||||
/* Transfer error */
|
||||
i2c_int_disable(idev, ~0);
|
||||
if (status & MST_STATUS_AL)
|
||||
@@ -328,6 +313,21 @@ static irqreturn_t axxia_i2c_isr(int irq, void *_dev)
|
||||
readl(idev->base + MST_TX_BYTES_XFRD),
|
||||
readl(idev->base + MST_TX_XFER));
|
||||
complete(&idev->msg_complete);
|
||||
} else if (status & MST_STATUS_SCC) {
|
||||
/* Stop completed */
|
||||
i2c_int_disable(idev, ~MST_STATUS_TSS);
|
||||
complete(&idev->msg_complete);
|
||||
} else if (status & MST_STATUS_SNS) {
|
||||
/* Transfer done */
|
||||
i2c_int_disable(idev, ~MST_STATUS_TSS);
|
||||
if (i2c_m_rd(idev->msg) && idev->msg_xfrd < idev->msg->len)
|
||||
axxia_i2c_empty_rx_fifo(idev);
|
||||
complete(&idev->msg_complete);
|
||||
} else if (status & MST_STATUS_TSS) {
|
||||
/* Transfer timeout */
|
||||
idev->msg_err = -ETIMEDOUT;
|
||||
i2c_int_disable(idev, ~MST_STATUS_TSS);
|
||||
complete(&idev->msg_complete);
|
||||
}
|
||||
|
||||
out:
|
||||
|
||||
@@ -1393,6 +1393,7 @@ static const struct acpi_device_id kx_acpi_match[] = {
|
||||
{"KXCJ1008", KXCJ91008},
|
||||
{"KXCJ9000", KXCJ91008},
|
||||
{"KIOX000A", KXCJ91008},
|
||||
{"KIOX010A", KXCJ91008}, /* KXCJ91008 inside the display of a 2-in-1 */
|
||||
{"KXTJ1009", KXTJ21009},
|
||||
{"SMO8500", KXCJ91008},
|
||||
{ },
|
||||
|
||||
@@ -471,6 +471,8 @@ send:
|
||||
goto op_err;
|
||||
if (!ret)
|
||||
goto rnr_nak;
|
||||
if (wqe->length > qp->r_len)
|
||||
goto inv_err;
|
||||
break;
|
||||
|
||||
case IB_WR_RDMA_WRITE_WITH_IMM:
|
||||
@@ -638,7 +640,10 @@ op_err:
|
||||
goto err;
|
||||
|
||||
inv_err:
|
||||
send_status = IB_WC_REM_INV_REQ_ERR;
|
||||
send_status =
|
||||
sqp->ibqp.qp_type == IB_QPT_RC ?
|
||||
IB_WC_REM_INV_REQ_ERR :
|
||||
IB_WC_SUCCESS;
|
||||
wc.status = IB_WC_LOC_QP_OP_ERR;
|
||||
goto err;
|
||||
|
||||
|
||||
@@ -449,6 +449,8 @@ again:
|
||||
goto op_err;
|
||||
if (!ret)
|
||||
goto rnr_nak;
|
||||
if (wqe->length > qp->r_len)
|
||||
goto inv_err;
|
||||
break;
|
||||
|
||||
case IB_WR_RDMA_WRITE_WITH_IMM:
|
||||
@@ -612,7 +614,10 @@ op_err:
|
||||
goto err;
|
||||
|
||||
inv_err:
|
||||
send_status = IB_WC_REM_INV_REQ_ERR;
|
||||
send_status =
|
||||
sqp->ibqp.qp_type == IB_QPT_RC ?
|
||||
IB_WC_REM_INV_REQ_ERR :
|
||||
IB_WC_SUCCESS;
|
||||
wc.status = IB_WC_LOC_QP_OP_ERR;
|
||||
goto err;
|
||||
|
||||
|
||||
@@ -464,7 +464,14 @@ static int iommu_init_device(struct device *dev)
|
||||
|
||||
dev_data->alias = get_alias(dev);
|
||||
|
||||
if (dev_is_pci(dev) && pci_iommuv2_capable(to_pci_dev(dev))) {
|
||||
/*
|
||||
* By default we use passthrough mode for IOMMUv2 capable device.
|
||||
* But if amd_iommu=force_isolation is set (e.g. to debug DMA to
|
||||
* invalid address), we ignore the capability for the device so
|
||||
* it'll be forced to go into translation mode.
|
||||
*/
|
||||
if ((iommu_pass_through || !amd_iommu_force_isolation) &&
|
||||
dev_is_pci(dev) && pci_iommuv2_capable(to_pci_dev(dev))) {
|
||||
struct amd_iommu *iommu;
|
||||
|
||||
iommu = amd_iommu_rlookup_table[dev_data->devid];
|
||||
|
||||
@@ -697,7 +697,13 @@ static void queue_inc_cons(struct arm_smmu_queue *q)
|
||||
u32 cons = (Q_WRP(q, q->cons) | Q_IDX(q, q->cons)) + 1;
|
||||
|
||||
q->cons = Q_OVF(q, q->cons) | Q_WRP(q, cons) | Q_IDX(q, cons);
|
||||
writel(q->cons, q->cons_reg);
|
||||
|
||||
/*
|
||||
* Ensure that all CPU accesses (reads and writes) to the queue
|
||||
* are complete before we update the cons pointer.
|
||||
*/
|
||||
mb();
|
||||
writel_relaxed(q->cons, q->cons_reg);
|
||||
}
|
||||
|
||||
static int queue_sync_prod(struct arm_smmu_queue *q)
|
||||
|
||||
@@ -297,6 +297,7 @@ enum arm_smmu_implementation {
|
||||
GENERIC_SMMU,
|
||||
ARM_MMU500,
|
||||
CAVIUM_SMMUV2,
|
||||
QCOM_SMMUV2,
|
||||
};
|
||||
|
||||
struct arm_smmu_s2cr {
|
||||
@@ -1894,6 +1895,7 @@ ARM_SMMU_MATCH_DATA(smmu_generic_v2, ARM_SMMU_V2, GENERIC_SMMU);
|
||||
ARM_SMMU_MATCH_DATA(arm_mmu401, ARM_SMMU_V1_64K, GENERIC_SMMU);
|
||||
ARM_SMMU_MATCH_DATA(arm_mmu500, ARM_SMMU_V2, ARM_MMU500);
|
||||
ARM_SMMU_MATCH_DATA(cavium_smmuv2, ARM_SMMU_V2, CAVIUM_SMMUV2);
|
||||
ARM_SMMU_MATCH_DATA(qcom_smmuv2, ARM_SMMU_V2, QCOM_SMMUV2);
|
||||
|
||||
static const struct of_device_id arm_smmu_of_match[] = {
|
||||
{ .compatible = "arm,smmu-v1", .data = &smmu_generic_v1 },
|
||||
@@ -1902,6 +1904,7 @@ static const struct of_device_id arm_smmu_of_match[] = {
|
||||
{ .compatible = "arm,mmu-401", .data = &arm_mmu401 },
|
||||
{ .compatible = "arm,mmu-500", .data = &arm_mmu500 },
|
||||
{ .compatible = "cavium,smmu-v2", .data = &cavium_smmuv2 },
|
||||
{ .compatible = "qcom,smmu-v2", .data = &qcom_smmuv2 },
|
||||
{ },
|
||||
};
|
||||
MODULE_DEVICE_TABLE(of, arm_smmu_of_match);
|
||||
|
||||
@@ -1169,11 +1169,13 @@ HFCPCI_l1hw(struct PStack *st, int pr, void *arg)
|
||||
if (cs->debug & L1_DEB_LAPD)
|
||||
debugl1(cs, "-> PH_REQUEST_PULL");
|
||||
#endif
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
if (!cs->tx_skb) {
|
||||
test_and_clear_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
|
||||
st->l1.l1l2(st, PH_PULL | CONFIRM, NULL);
|
||||
} else
|
||||
test_and_set_bit(FLG_L1_PULL_REQ, &st->l1.Flags);
|
||||
spin_unlock_irqrestore(&cs->lock, flags);
|
||||
break;
|
||||
case (HW_RESET | REQUEST):
|
||||
spin_lock_irqsave(&cs->lock, flags);
|
||||
|
||||
@@ -590,7 +590,7 @@ static const struct v4l2_dv_timings_cap ad9389b_timings_cap = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 170000000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 170000000,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
|
||||
|
||||
@@ -142,7 +142,7 @@ static const struct v4l2_dv_timings_cap adv7511_timings_cap = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, ADV7511_MAX_WIDTH, 0, ADV7511_MAX_HEIGHT,
|
||||
V4L2_INIT_BT_TIMINGS(640, ADV7511_MAX_WIDTH, 350, ADV7511_MAX_HEIGHT,
|
||||
ADV7511_MIN_PIXELCLOCK, ADV7511_MAX_PIXELCLOCK,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
|
||||
@@ -777,7 +777,7 @@ static const struct v4l2_dv_timings_cap adv7604_timings_cap_analog = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 170000000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 170000000,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
|
||||
@@ -788,7 +788,7 @@ static const struct v4l2_dv_timings_cap adv76xx_timings_cap_digital = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 225000000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 225000000,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
|
||||
|
||||
@@ -676,7 +676,7 @@ static const struct v4l2_dv_timings_cap adv7842_timings_cap_analog = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 170000000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 170000000,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
|
||||
@@ -687,7 +687,7 @@ static const struct v4l2_dv_timings_cap adv7842_timings_cap_digital = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1200, 25000000, 225000000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 25000000, 225000000,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
V4L2_DV_BT_CAP_PROGRESSIVE | V4L2_DV_BT_CAP_REDUCED_BLANKING |
|
||||
|
||||
@@ -66,7 +66,7 @@ static const struct v4l2_dv_timings_cap tc358743_timings_cap = {
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
/* Pixel clock from REF_01 p. 20. Min/max height/width are unknown */
|
||||
V4L2_INIT_BT_TIMINGS(1, 10000, 1, 10000, 0, 165000000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1200, 13000000, 165000000,
|
||||
V4L2_DV_BT_STD_CEA861 | V4L2_DV_BT_STD_DMT |
|
||||
V4L2_DV_BT_STD_GTF | V4L2_DV_BT_STD_CVT,
|
||||
V4L2_DV_BT_CAP_PROGRESSIVE |
|
||||
|
||||
@@ -49,7 +49,7 @@ static const struct v4l2_dv_timings_cap ths8200_timings_cap = {
|
||||
.type = V4L2_DV_BT_656_1120,
|
||||
/* keep this initialization for compatibility with GCC < 4.4.6 */
|
||||
.reserved = { 0 },
|
||||
V4L2_INIT_BT_TIMINGS(0, 1920, 0, 1080, 25000000, 148500000,
|
||||
V4L2_INIT_BT_TIMINGS(640, 1920, 350, 1080, 25000000, 148500000,
|
||||
V4L2_DV_BT_STD_CEA861, V4L2_DV_BT_CAP_PROGRESSIVE)
|
||||
};
|
||||
|
||||
|
||||
@@ -753,7 +753,7 @@ static int vpbe_initialize(struct device *dev, struct vpbe_device *vpbe_dev)
|
||||
if (ret) {
|
||||
v4l2_err(&vpbe_dev->v4l2_dev, "Failed to set default output %s",
|
||||
def_output);
|
||||
return ret;
|
||||
goto fail_kfree_amp;
|
||||
}
|
||||
|
||||
printk(KERN_NOTICE "Setting default mode to %s\n", def_mode);
|
||||
@@ -761,12 +761,15 @@ static int vpbe_initialize(struct device *dev, struct vpbe_device *vpbe_dev)
|
||||
if (ret) {
|
||||
v4l2_err(&vpbe_dev->v4l2_dev, "Failed to set default mode %s",
|
||||
def_mode);
|
||||
return ret;
|
||||
goto fail_kfree_amp;
|
||||
}
|
||||
vpbe_dev->initialized = 1;
|
||||
/* TBD handling of bootargs for default output and mode */
|
||||
return 0;
|
||||
|
||||
fail_kfree_amp:
|
||||
mutex_lock(&vpbe_dev->lock);
|
||||
kfree(vpbe_dev->amp);
|
||||
fail_kfree_encoders:
|
||||
kfree(vpbe_dev->encoders);
|
||||
fail_dev_unregister:
|
||||
|
||||
@@ -41,25 +41,27 @@ int mtk_vcodec_init_enc_pm(struct mtk_vcodec_dev *mtkdev)
|
||||
node = of_parse_phandle(dev->of_node, "mediatek,larb", 0);
|
||||
if (!node) {
|
||||
mtk_v4l2_err("no mediatek,larb found");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
pdev = of_find_device_by_node(node);
|
||||
of_node_put(node);
|
||||
if (!pdev) {
|
||||
mtk_v4l2_err("no mediatek,larb device found");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
pm->larbvenc = &pdev->dev;
|
||||
|
||||
node = of_parse_phandle(dev->of_node, "mediatek,larb", 1);
|
||||
if (!node) {
|
||||
mtk_v4l2_err("no mediatek,larb found");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pdev = of_find_device_by_node(node);
|
||||
of_node_put(node);
|
||||
if (!pdev) {
|
||||
mtk_v4l2_err("no mediatek,larb device found");
|
||||
return -1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
pm->larbvenclt = &pdev->dev;
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
#include <linux/delay.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/pm_runtime.h>
|
||||
|
||||
#define DRIVER_NAME "memstick"
|
||||
|
||||
@@ -436,6 +437,7 @@ static void memstick_check(struct work_struct *work)
|
||||
struct memstick_dev *card;
|
||||
|
||||
dev_dbg(&host->dev, "memstick_check started\n");
|
||||
pm_runtime_get_noresume(host->dev.parent);
|
||||
mutex_lock(&host->lock);
|
||||
if (!host->card) {
|
||||
if (memstick_power_on(host))
|
||||
@@ -479,6 +481,7 @@ out_power_off:
|
||||
host->set_param(host, MEMSTICK_POWER, MEMSTICK_POWER_OFF);
|
||||
|
||||
mutex_unlock(&host->lock);
|
||||
pm_runtime_put(host->dev.parent);
|
||||
dev_dbg(&host->dev, "memstick_check finished\n");
|
||||
}
|
||||
|
||||
|
||||
@@ -378,7 +378,6 @@ static void bcm_sysport_get_wol(struct net_device *dev,
|
||||
struct ethtool_wolinfo *wol)
|
||||
{
|
||||
struct bcm_sysport_priv *priv = netdev_priv(dev);
|
||||
u32 reg;
|
||||
|
||||
wol->supported = WAKE_MAGIC | WAKE_MAGICSECURE;
|
||||
wol->wolopts = priv->wolopts;
|
||||
@@ -386,11 +385,7 @@ static void bcm_sysport_get_wol(struct net_device *dev,
|
||||
if (!(priv->wolopts & WAKE_MAGICSECURE))
|
||||
return;
|
||||
|
||||
/* Return the programmed SecureOn password */
|
||||
reg = umac_readl(priv, UMAC_PSW_MS);
|
||||
put_unaligned_be16(reg, &wol->sopass[0]);
|
||||
reg = umac_readl(priv, UMAC_PSW_LS);
|
||||
put_unaligned_be32(reg, &wol->sopass[2]);
|
||||
memcpy(wol->sopass, priv->sopass, sizeof(priv->sopass));
|
||||
}
|
||||
|
||||
static int bcm_sysport_set_wol(struct net_device *dev,
|
||||
@@ -406,13 +401,8 @@ static int bcm_sysport_set_wol(struct net_device *dev,
|
||||
if (wol->wolopts & ~supported)
|
||||
return -EINVAL;
|
||||
|
||||
/* Program the SecureOn password */
|
||||
if (wol->wolopts & WAKE_MAGICSECURE) {
|
||||
umac_writel(priv, get_unaligned_be16(&wol->sopass[0]),
|
||||
UMAC_PSW_MS);
|
||||
umac_writel(priv, get_unaligned_be32(&wol->sopass[2]),
|
||||
UMAC_PSW_LS);
|
||||
}
|
||||
if (wol->wolopts & WAKE_MAGICSECURE)
|
||||
memcpy(priv->sopass, wol->sopass, sizeof(priv->sopass));
|
||||
|
||||
/* Flag the device and relevant IRQ as wakeup capable */
|
||||
if (wol->wolopts) {
|
||||
@@ -1875,12 +1865,17 @@ static int bcm_sysport_suspend_to_wol(struct bcm_sysport_priv *priv)
|
||||
unsigned int timeout = 1000;
|
||||
u32 reg;
|
||||
|
||||
/* Password has already been programmed */
|
||||
reg = umac_readl(priv, UMAC_MPD_CTRL);
|
||||
reg |= MPD_EN;
|
||||
reg &= ~PSW_EN;
|
||||
if (priv->wolopts & WAKE_MAGICSECURE)
|
||||
if (priv->wolopts & WAKE_MAGICSECURE) {
|
||||
/* Program the SecureOn password */
|
||||
umac_writel(priv, get_unaligned_be16(&priv->sopass[0]),
|
||||
UMAC_PSW_MS);
|
||||
umac_writel(priv, get_unaligned_be32(&priv->sopass[2]),
|
||||
UMAC_PSW_LS);
|
||||
reg |= PSW_EN;
|
||||
}
|
||||
umac_writel(priv, reg, UMAC_MPD_CTRL);
|
||||
|
||||
/* Make sure RBUF entered WoL mode as result */
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
#ifndef __BCM_SYSPORT_H
|
||||
#define __BCM_SYSPORT_H
|
||||
|
||||
#include <linux/ethtool.h>
|
||||
#include <linux/if_vlan.h>
|
||||
|
||||
/* Receive/transmit descriptor format */
|
||||
@@ -681,6 +682,7 @@ struct bcm_sysport_priv {
|
||||
unsigned int crc_fwd:1;
|
||||
u16 rev;
|
||||
u32 wolopts;
|
||||
u8 sopass[SOPASS_MAX];
|
||||
unsigned int wol_irq_disabled:1;
|
||||
|
||||
/* MIB related fields */
|
||||
|
||||
@@ -1180,7 +1180,7 @@ static void enic_rq_indicate_buf(struct vnic_rq *rq,
|
||||
* CHECSUM_UNNECESSARY.
|
||||
*/
|
||||
if ((netdev->features & NETIF_F_RXCSUM) && tcp_udp_csum_ok &&
|
||||
ipv4_csum_ok)
|
||||
(ipv4_csum_ok || ipv6))
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
if (vlan_stripped)
|
||||
|
||||
@@ -923,7 +923,7 @@ int memac_add_hash_mac_address(struct fman_mac *memac, enet_addr_t *eth_addr)
|
||||
hash = get_mac_addr_hash_code(addr) & HASH_CTRL_ADDR_MASK;
|
||||
|
||||
/* Create element to be added to the driver hash table */
|
||||
hash_entry = kmalloc(sizeof(*hash_entry), GFP_KERNEL);
|
||||
hash_entry = kmalloc(sizeof(*hash_entry), GFP_ATOMIC);
|
||||
if (!hash_entry)
|
||||
return -ENOMEM;
|
||||
hash_entry->addr = addr;
|
||||
|
||||
@@ -551,7 +551,7 @@ int tgec_add_hash_mac_address(struct fman_mac *tgec, enet_addr_t *eth_addr)
|
||||
hash = (crc >> TGEC_HASH_MCAST_SHIFT) & TGEC_HASH_ADR_MSK;
|
||||
|
||||
/* Create element to be added to the driver hash table */
|
||||
hash_entry = kmalloc(sizeof(*hash_entry), GFP_KERNEL);
|
||||
hash_entry = kmalloc(sizeof(*hash_entry), GFP_ATOMIC);
|
||||
if (!hash_entry)
|
||||
return -ENOMEM;
|
||||
hash_entry->addr = addr;
|
||||
|
||||
@@ -9194,6 +9194,9 @@ static int i40e_config_netdev(struct i40e_vsi *vsi)
|
||||
ether_addr_copy(netdev->dev_addr, mac_addr);
|
||||
ether_addr_copy(netdev->perm_addr, mac_addr);
|
||||
|
||||
/* i40iw_net_event() reads 16 bytes from neigh->primary_key */
|
||||
netdev->neigh_priv_len = sizeof(u32) * 4;
|
||||
|
||||
netdev->priv_flags |= IFF_UNICAST_FLT;
|
||||
netdev->priv_flags |= IFF_SUPP_NOFCS;
|
||||
/* Setup netdev TC information */
|
||||
|
||||
@@ -7564,9 +7564,11 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake,
|
||||
rtnl_unlock();
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
retval = pci_save_state(pdev);
|
||||
if (retval)
|
||||
return retval;
|
||||
if (!runtime) {
|
||||
retval = pci_save_state(pdev);
|
||||
if (retval)
|
||||
return retval;
|
||||
}
|
||||
#endif
|
||||
|
||||
status = rd32(E1000_STATUS);
|
||||
|
||||
@@ -152,8 +152,10 @@ static void skge_get_regs(struct net_device *dev, struct ethtool_regs *regs,
|
||||
memset(p, 0, regs->len);
|
||||
memcpy_fromio(p, io, B3_RAM_ADDR);
|
||||
|
||||
memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1,
|
||||
regs->len - B3_RI_WTO_R1);
|
||||
if (regs->len > B3_RI_WTO_R1) {
|
||||
memcpy_fromio(p + B3_RI_WTO_R1, io + B3_RI_WTO_R1,
|
||||
regs->len - B3_RI_WTO_R1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Wake on Lan only supported on Yukon chips with rev 1 or above */
|
||||
|
||||
@@ -553,6 +553,8 @@ static inline bool is_first_ethertype_ip(struct sk_buff *skb)
|
||||
return (ethertype == htons(ETH_P_IP) || ethertype == htons(ETH_P_IPV6));
|
||||
}
|
||||
|
||||
#define short_frame(size) ((size) <= ETH_ZLEN + ETH_FCS_LEN)
|
||||
|
||||
static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
struct mlx5_cqe64 *cqe,
|
||||
struct mlx5e_rq *rq,
|
||||
@@ -567,6 +569,17 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
return;
|
||||
}
|
||||
|
||||
/* CQE csum doesn't cover padding octets in short ethernet
|
||||
* frames. And the pad field is appended prior to calculating
|
||||
* and appending the FCS field.
|
||||
*
|
||||
* Detecting these padded frames requires to verify and parse
|
||||
* IP headers, so we simply force all those small frames to be
|
||||
* CHECKSUM_UNNECESSARY even if they are not padded.
|
||||
*/
|
||||
if (short_frame(skb->len))
|
||||
goto csum_unnecessary;
|
||||
|
||||
if (is_first_ethertype_ip(skb)) {
|
||||
skb->ip_summed = CHECKSUM_COMPLETE;
|
||||
skb->csum = csum_unfold((__force __sum16)cqe->check_sum);
|
||||
@@ -574,6 +587,7 @@ static inline void mlx5e_handle_csum(struct net_device *netdev,
|
||||
return;
|
||||
}
|
||||
|
||||
csum_unnecessary:
|
||||
if (likely((cqe->hds_ip_ext & CQE_L3_OK) &&
|
||||
(cqe->hds_ip_ext & CQE_L4_OK))) {
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
@@ -8121,6 +8121,8 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
|
||||
start += 3;
|
||||
|
||||
prop_len = niu_pci_eeprom_read(np, start + 4);
|
||||
if (prop_len < 0)
|
||||
return prop_len;
|
||||
err = niu_pci_vpd_get_propname(np, start + 5, namebuf, 64);
|
||||
if (err < 0)
|
||||
return err;
|
||||
@@ -8165,8 +8167,12 @@ static int niu_pci_vpd_scan_props(struct niu *np, u32 start, u32 end)
|
||||
netif_printk(np, probe, KERN_DEBUG, np->dev,
|
||||
"VPD_SCAN: Reading in property [%s] len[%d]\n",
|
||||
namebuf, prop_len);
|
||||
for (i = 0; i < prop_len; i++)
|
||||
*prop_buf++ = niu_pci_eeprom_read(np, off + i);
|
||||
for (i = 0; i < prop_len; i++) {
|
||||
err = niu_pci_eeprom_read(np, off + i);
|
||||
if (err >= 0)
|
||||
*prop_buf = err;
|
||||
++prop_buf;
|
||||
}
|
||||
}
|
||||
|
||||
start += len;
|
||||
|
||||
@@ -891,14 +891,14 @@ static void decode_txts(struct dp83640_private *dp83640,
|
||||
struct phy_txts *phy_txts)
|
||||
{
|
||||
struct skb_shared_hwtstamps shhwtstamps;
|
||||
struct dp83640_skb_info *skb_info;
|
||||
struct sk_buff *skb;
|
||||
u64 ns;
|
||||
u8 overflow;
|
||||
u64 ns;
|
||||
|
||||
/* We must already have the skb that triggered this. */
|
||||
|
||||
again:
|
||||
skb = skb_dequeue(&dp83640->tx_queue);
|
||||
|
||||
if (!skb) {
|
||||
pr_debug("have timestamp but tx_queue empty\n");
|
||||
return;
|
||||
@@ -913,6 +913,11 @@ static void decode_txts(struct dp83640_private *dp83640,
|
||||
}
|
||||
return;
|
||||
}
|
||||
skb_info = (struct dp83640_skb_info *)skb->cb;
|
||||
if (time_after(jiffies, skb_info->tmo)) {
|
||||
kfree_skb(skb);
|
||||
goto again;
|
||||
}
|
||||
|
||||
ns = phy2txts(phy_txts);
|
||||
memset(&shhwtstamps, 0, sizeof(shhwtstamps));
|
||||
@@ -1463,6 +1468,7 @@ static bool dp83640_rxtstamp(struct phy_device *phydev,
|
||||
static void dp83640_txtstamp(struct phy_device *phydev,
|
||||
struct sk_buff *skb, int type)
|
||||
{
|
||||
struct dp83640_skb_info *skb_info = (struct dp83640_skb_info *)skb->cb;
|
||||
struct dp83640_private *dp83640 = phydev->priv;
|
||||
|
||||
switch (dp83640->hwts_tx_en) {
|
||||
@@ -1475,6 +1481,7 @@ static void dp83640_txtstamp(struct phy_device *phydev,
|
||||
/* fall through */
|
||||
case HWTSTAMP_TX_ON:
|
||||
skb_shinfo(skb)->tx_flags |= SKBTX_IN_PROGRESS;
|
||||
skb_info->tmo = jiffies + SKB_TIMESTAMP_TIMEOUT;
|
||||
skb_queue_tail(&dp83640->tx_queue, skb);
|
||||
break;
|
||||
|
||||
|
||||
@@ -267,7 +267,7 @@ struct ath_node {
|
||||
#endif
|
||||
u8 key_idx[4];
|
||||
|
||||
u32 ackto;
|
||||
int ackto;
|
||||
struct list_head list;
|
||||
};
|
||||
|
||||
|
||||
@@ -29,9 +29,13 @@
|
||||
* ath_dynack_ewma - EWMA (Exponentially Weighted Moving Average) calculation
|
||||
*
|
||||
*/
|
||||
static inline u32 ath_dynack_ewma(u32 old, u32 new)
|
||||
static inline int ath_dynack_ewma(int old, int new)
|
||||
{
|
||||
return (new * (EWMA_DIV - EWMA_LEVEL) + old * EWMA_LEVEL) / EWMA_DIV;
|
||||
if (old > 0)
|
||||
return (new * (EWMA_DIV - EWMA_LEVEL) +
|
||||
old * EWMA_LEVEL) / EWMA_DIV;
|
||||
else
|
||||
return new;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -82,10 +86,10 @@ static inline bool ath_dynack_bssidmask(struct ath_hw *ah, const u8 *mac)
|
||||
*/
|
||||
static void ath_dynack_compute_ackto(struct ath_hw *ah)
|
||||
{
|
||||
struct ath_node *an;
|
||||
u32 to = 0;
|
||||
struct ath_dynack *da = &ah->dynack;
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ath_dynack *da = &ah->dynack;
|
||||
struct ath_node *an;
|
||||
int to = 0;
|
||||
|
||||
list_for_each_entry(an, &da->nodes, list)
|
||||
if (an->ackto > to)
|
||||
@@ -144,7 +148,8 @@ static void ath_dynack_compute_to(struct ath_hw *ah)
|
||||
an->ackto = ath_dynack_ewma(an->ackto,
|
||||
ackto);
|
||||
ath_dbg(ath9k_hw_common(ah), DYNACK,
|
||||
"%pM to %u\n", dst, an->ackto);
|
||||
"%pM to %d [%u]\n", dst,
|
||||
an->ackto, ackto);
|
||||
if (time_is_before_jiffies(da->lto)) {
|
||||
ath_dynack_compute_ackto(ah);
|
||||
da->lto = jiffies + COMPUTE_TO;
|
||||
@@ -166,10 +171,12 @@ static void ath_dynack_compute_to(struct ath_hw *ah)
|
||||
* @ah: ath hw
|
||||
* @skb: socket buffer
|
||||
* @ts: tx status info
|
||||
* @sta: station pointer
|
||||
*
|
||||
*/
|
||||
void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
struct ath_tx_status *ts)
|
||||
struct ath_tx_status *ts,
|
||||
struct ieee80211_sta *sta)
|
||||
{
|
||||
u8 ridx;
|
||||
struct ieee80211_hdr *hdr;
|
||||
@@ -177,7 +184,7 @@ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_tx_info *info = IEEE80211_SKB_CB(skb);
|
||||
|
||||
if ((info->flags & IEEE80211_TX_CTL_NO_ACK) || !da->enabled)
|
||||
if (!da->enabled || (info->flags & IEEE80211_TX_CTL_NO_ACK))
|
||||
return;
|
||||
|
||||
spin_lock_bh(&da->qlock);
|
||||
@@ -187,11 +194,19 @@ void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
/* late ACK */
|
||||
if (ts->ts_status & ATH9K_TXERR_XRETRY) {
|
||||
if (ieee80211_is_assoc_req(hdr->frame_control) ||
|
||||
ieee80211_is_assoc_resp(hdr->frame_control)) {
|
||||
ieee80211_is_assoc_resp(hdr->frame_control) ||
|
||||
ieee80211_is_auth(hdr->frame_control)) {
|
||||
ath_dbg(common, DYNACK, "late ack\n");
|
||||
|
||||
ath9k_hw_setslottime(ah, (LATEACK_TO - 3) / 2);
|
||||
ath9k_hw_set_ack_timeout(ah, LATEACK_TO);
|
||||
ath9k_hw_set_cts_timeout(ah, LATEACK_TO);
|
||||
if (sta) {
|
||||
struct ath_node *an;
|
||||
|
||||
an = (struct ath_node *)sta->drv_priv;
|
||||
an->ackto = -1;
|
||||
}
|
||||
da->lto = jiffies + LATEACK_DELAY;
|
||||
}
|
||||
|
||||
@@ -251,7 +266,7 @@ void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
struct ath_common *common = ath9k_hw_common(ah);
|
||||
struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
|
||||
|
||||
if (!ath_dynack_bssidmask(ah, hdr->addr1) || !da->enabled)
|
||||
if (!da->enabled || !ath_dynack_bssidmask(ah, hdr->addr1))
|
||||
return;
|
||||
|
||||
spin_lock_bh(&da->qlock);
|
||||
|
||||
@@ -86,7 +86,8 @@ void ath_dynack_node_deinit(struct ath_hw *ah, struct ath_node *an);
|
||||
void ath_dynack_init(struct ath_hw *ah);
|
||||
void ath_dynack_sample_ack_ts(struct ath_hw *ah, struct sk_buff *skb, u32 ts);
|
||||
void ath_dynack_sample_tx_ts(struct ath_hw *ah, struct sk_buff *skb,
|
||||
struct ath_tx_status *ts);
|
||||
struct ath_tx_status *ts,
|
||||
struct ieee80211_sta *sta);
|
||||
#else
|
||||
static inline void ath_dynack_init(struct ath_hw *ah) {}
|
||||
static inline void ath_dynack_node_init(struct ath_hw *ah,
|
||||
@@ -97,7 +98,8 @@ static inline void ath_dynack_sample_ack_ts(struct ath_hw *ah,
|
||||
struct sk_buff *skb, u32 ts) {}
|
||||
static inline void ath_dynack_sample_tx_ts(struct ath_hw *ah,
|
||||
struct sk_buff *skb,
|
||||
struct ath_tx_status *ts) {}
|
||||
struct ath_tx_status *ts,
|
||||
struct ieee80211_sta *sta) {}
|
||||
#endif
|
||||
|
||||
#endif /* DYNACK_H */
|
||||
|
||||
@@ -593,7 +593,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq,
|
||||
if (bf == bf->bf_lastbf)
|
||||
ath_dynack_sample_tx_ts(sc->sc_ah,
|
||||
bf->bf_mpdu,
|
||||
ts);
|
||||
ts, sta);
|
||||
}
|
||||
|
||||
ath_tx_complete_buf(sc, bf, txq, &bf_head, sta, ts,
|
||||
@@ -709,7 +709,8 @@ static void ath_tx_process_buffer(struct ath_softc *sc, struct ath_txq *txq,
|
||||
memcpy(info->control.rates, bf->rates,
|
||||
sizeof(info->control.rates));
|
||||
ath_tx_rc_status(sc, bf, ts, 1, txok ? 0 : 1, txok);
|
||||
ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts);
|
||||
ath_dynack_sample_tx_ts(sc->sc_ah, bf->bf_mpdu, ts,
|
||||
sta);
|
||||
}
|
||||
ath_tx_complete_buf(sc, bf, txq, bf_head, sta, ts, txok);
|
||||
} else
|
||||
|
||||
@@ -78,6 +78,10 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
||||
if (req->n_ssids > WSM_SCAN_MAX_NUM_OF_SSIDS)
|
||||
return -EINVAL;
|
||||
|
||||
/* will be unlocked in cw1200_scan_work() */
|
||||
down(&priv->scan.lock);
|
||||
mutex_lock(&priv->conf_mutex);
|
||||
|
||||
frame.skb = ieee80211_probereq_get(hw, priv->vif->addr, NULL, 0,
|
||||
req->ie_len);
|
||||
if (!frame.skb)
|
||||
@@ -86,19 +90,15 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
||||
if (req->ie_len)
|
||||
memcpy(skb_put(frame.skb, req->ie_len), req->ie, req->ie_len);
|
||||
|
||||
/* will be unlocked in cw1200_scan_work() */
|
||||
down(&priv->scan.lock);
|
||||
mutex_lock(&priv->conf_mutex);
|
||||
|
||||
ret = wsm_set_template_frame(priv, &frame);
|
||||
if (!ret) {
|
||||
/* Host want to be the probe responder. */
|
||||
ret = wsm_set_probe_responder(priv, true);
|
||||
}
|
||||
if (ret) {
|
||||
dev_kfree_skb(frame.skb);
|
||||
mutex_unlock(&priv->conf_mutex);
|
||||
up(&priv->scan.lock);
|
||||
dev_kfree_skb(frame.skb);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -120,10 +120,9 @@ int cw1200_hw_scan(struct ieee80211_hw *hw,
|
||||
++priv->scan.n_ssids;
|
||||
}
|
||||
|
||||
mutex_unlock(&priv->conf_mutex);
|
||||
|
||||
if (frame.skb)
|
||||
dev_kfree_skb(frame.skb);
|
||||
mutex_unlock(&priv->conf_mutex);
|
||||
queue_work(priv->workqueue, &priv->scan.work);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -731,6 +731,11 @@ static void vmd_remove(struct pci_dev *dev)
|
||||
static int vmd_suspend(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct vmd_dev *vmd = pci_get_drvdata(pdev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < vmd->msix_count; i++)
|
||||
devm_free_irq(dev, pci_irq_vector(pdev, i), &vmd->irqs[i]);
|
||||
|
||||
pci_save_state(pdev);
|
||||
return 0;
|
||||
@@ -739,6 +744,16 @@ static int vmd_suspend(struct device *dev)
|
||||
static int vmd_resume(struct device *dev)
|
||||
{
|
||||
struct pci_dev *pdev = to_pci_dev(dev);
|
||||
struct vmd_dev *vmd = pci_get_drvdata(pdev);
|
||||
int err, i;
|
||||
|
||||
for (i = 0; i < vmd->msix_count; i++) {
|
||||
err = devm_request_irq(dev, pci_irq_vector(pdev, i),
|
||||
vmd_irq, IRQF_NO_THREAD,
|
||||
"vmd", &vmd->irqs[i]);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
|
||||
pci_restore_state(pdev);
|
||||
return 0;
|
||||
|
||||
@@ -736,7 +736,9 @@ static const char * const gpio_groups[] = {
|
||||
"BOOT_5", "BOOT_6", "BOOT_7", "BOOT_8", "BOOT_9",
|
||||
"BOOT_10", "BOOT_11", "BOOT_12", "BOOT_13", "BOOT_14",
|
||||
"BOOT_15", "BOOT_16", "BOOT_17", "BOOT_18",
|
||||
};
|
||||
|
||||
static const char * const gpio_aobus_groups[] = {
|
||||
"GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3",
|
||||
"GPIOAO_4", "GPIOAO_5", "GPIOAO_6", "GPIOAO_7",
|
||||
"GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
|
||||
@@ -908,6 +910,7 @@ static struct meson_pmx_func meson8_cbus_functions[] = {
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson8_aobus_functions[] = {
|
||||
FUNCTION(gpio_aobus),
|
||||
FUNCTION(uart_ao),
|
||||
FUNCTION(remote),
|
||||
FUNCTION(i2c_slave_ao),
|
||||
|
||||
@@ -643,16 +643,18 @@ static const char * const gpio_groups[] = {
|
||||
"BOOT_10", "BOOT_11", "BOOT_12", "BOOT_13", "BOOT_14",
|
||||
"BOOT_15", "BOOT_16", "BOOT_17", "BOOT_18",
|
||||
|
||||
"GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3",
|
||||
"GPIOAO_4", "GPIOAO_5", "GPIOAO_6", "GPIOAO_7",
|
||||
"GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
|
||||
"GPIOAO_12", "GPIOAO_13", "GPIO_BSD_EN", "GPIO_TEST_N",
|
||||
|
||||
"DIF_0_P", "DIF_0_N", "DIF_1_P", "DIF_1_N",
|
||||
"DIF_2_P", "DIF_2_N", "DIF_3_P", "DIF_3_N",
|
||||
"DIF_4_P", "DIF_4_N"
|
||||
};
|
||||
|
||||
static const char * const gpio_aobus_groups[] = {
|
||||
"GPIOAO_0", "GPIOAO_1", "GPIOAO_2", "GPIOAO_3",
|
||||
"GPIOAO_4", "GPIOAO_5", "GPIOAO_6", "GPIOAO_7",
|
||||
"GPIOAO_8", "GPIOAO_9", "GPIOAO_10", "GPIOAO_11",
|
||||
"GPIOAO_12", "GPIOAO_13", "GPIO_BSD_EN", "GPIO_TEST_N"
|
||||
};
|
||||
|
||||
static const char * const sd_a_groups[] = {
|
||||
"sd_d0_a", "sd_d1_a", "sd_d2_a", "sd_d3_a", "sd_clk_a",
|
||||
"sd_cmd_a"
|
||||
@@ -868,6 +870,7 @@ static struct meson_pmx_func meson8b_cbus_functions[] = {
|
||||
};
|
||||
|
||||
static struct meson_pmx_func meson8b_aobus_functions[] = {
|
||||
FUNCTION(gpio_aobus),
|
||||
FUNCTION(uart_ao),
|
||||
FUNCTION(uart_ao_b),
|
||||
FUNCTION(i2c_slave_ao),
|
||||
|
||||
@@ -228,7 +228,9 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
pct->sec = ts.tv_sec;
|
||||
pct->nsec = ts.tv_nsec;
|
||||
pct++;
|
||||
ptp->info->gettime64(ptp->info, &ts);
|
||||
err = ptp->info->gettime64(ptp->info, &ts);
|
||||
if (err)
|
||||
goto out;
|
||||
pct->sec = ts.tv_sec;
|
||||
pct->nsec = ts.tv_nsec;
|
||||
pct++;
|
||||
@@ -281,6 +283,7 @@ long ptp_ioctl(struct posix_clock *pc, unsigned int cmd, unsigned long arg)
|
||||
break;
|
||||
}
|
||||
|
||||
out:
|
||||
kfree(sysoff);
|
||||
return err;
|
||||
}
|
||||
|
||||
@@ -281,7 +281,7 @@ static ssize_t asd_show_dev_rev(struct device *dev,
|
||||
return snprintf(buf, PAGE_SIZE, "%s\n",
|
||||
asd_dev_rev[asd_ha->revision_id]);
|
||||
}
|
||||
static DEVICE_ATTR(revision, S_IRUGO, asd_show_dev_rev, NULL);
|
||||
static DEVICE_ATTR(aic_revision, S_IRUGO, asd_show_dev_rev, NULL);
|
||||
|
||||
static ssize_t asd_show_dev_bios_build(struct device *dev,
|
||||
struct device_attribute *attr,char *buf)
|
||||
@@ -478,7 +478,7 @@ static int asd_create_dev_attrs(struct asd_ha_struct *asd_ha)
|
||||
{
|
||||
int err;
|
||||
|
||||
err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_revision);
|
||||
err = device_create_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@@ -500,13 +500,13 @@ err_update_bios:
|
||||
err_biosb:
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
|
||||
err_rev:
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
|
||||
return err;
|
||||
}
|
||||
|
||||
static void asd_remove_dev_attrs(struct asd_ha_struct *asd_ha)
|
||||
{
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_revision);
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_aic_revision);
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_bios_build);
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_pcba_sn);
|
||||
device_remove_file(&asd_ha->pcidev->dev, &dev_attr_update_bios);
|
||||
|
||||
@@ -5396,6 +5396,9 @@ error:
|
||||
stat = (struct ls_rjt *)(pcmd + sizeof(uint32_t));
|
||||
stat->un.b.lsRjtRsnCode = LSRJT_UNABLE_TPC;
|
||||
|
||||
if (shdr_add_status == ADD_STATUS_OPERATION_ALREADY_ACTIVE)
|
||||
stat->un.b.lsRjtRsnCodeExp = LSEXP_CMD_IN_PROGRESS;
|
||||
|
||||
elsiocb->iocb_cmpl = lpfc_cmpl_els_rsp;
|
||||
phba->fc_stat.elsXmitLSRJT++;
|
||||
rc = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
|
||||
|
||||
@@ -473,6 +473,7 @@ struct bmic_host_wellness_driver_version {
|
||||
u8 driver_version_tag[2];
|
||||
__le16 driver_version_length;
|
||||
char driver_version[32];
|
||||
u8 dont_write_tag[2];
|
||||
u8 end_tag[2];
|
||||
};
|
||||
|
||||
@@ -502,6 +503,8 @@ static int pqi_write_driver_version_to_host_wellness(
|
||||
strncpy(buffer->driver_version, DRIVER_VERSION,
|
||||
sizeof(buffer->driver_version) - 1);
|
||||
buffer->driver_version[sizeof(buffer->driver_version) - 1] = '\0';
|
||||
buffer->dont_write_tag[0] = 'D';
|
||||
buffer->dont_write_tag[1] = 'W';
|
||||
buffer->end_tag[0] = 'Z';
|
||||
buffer->end_tag[1] = 'Z';
|
||||
|
||||
@@ -980,6 +983,9 @@ static void pqi_get_volume_status(struct pqi_ctrl_info *ctrl_info,
|
||||
if (rc)
|
||||
goto out;
|
||||
|
||||
if (vpd->page_code != CISS_VPD_LV_STATUS)
|
||||
goto out;
|
||||
|
||||
page_length = offsetof(struct ciss_vpd_logical_volume_status,
|
||||
volume_status) + vpd->page_length;
|
||||
if (page_length < sizeof(*vpd))
|
||||
|
||||
@@ -31,13 +31,17 @@ static const struct of_device_id brcmstb_machine_match[] = {
|
||||
|
||||
bool soc_is_brcmstb(void)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct device_node *root;
|
||||
|
||||
root = of_find_node_by_path("/");
|
||||
if (!root)
|
||||
return false;
|
||||
|
||||
return of_match_node(brcmstb_machine_match, root) != NULL;
|
||||
match = of_match_node(brcmstb_machine_match, root);
|
||||
of_node_put(root);
|
||||
|
||||
return match != NULL;
|
||||
}
|
||||
|
||||
static const struct of_device_id sun_top_ctrl_match[] = {
|
||||
|
||||
@@ -22,11 +22,15 @@ static const struct of_device_id tegra_machine_match[] = {
|
||||
|
||||
bool soc_is_tegra(void)
|
||||
{
|
||||
const struct of_device_id *match;
|
||||
struct device_node *root;
|
||||
|
||||
root = of_find_node_by_path("/");
|
||||
if (!root)
|
||||
return false;
|
||||
|
||||
return of_match_node(tegra_machine_match, root) != NULL;
|
||||
match = of_match_node(tegra_machine_match, root);
|
||||
of_node_put(root);
|
||||
|
||||
return match != NULL;
|
||||
}
|
||||
|
||||
@@ -250,7 +250,9 @@ static int ad7280_read(struct ad7280_state *st, unsigned int devaddr,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
__ad7280_read32(st, &tmp);
|
||||
ret = __ad7280_read32(st, &tmp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ad7280_check_crc(st, tmp))
|
||||
return -EIO;
|
||||
@@ -288,7 +290,9 @@ static int ad7280_read_channel(struct ad7280_state *st, unsigned int devaddr,
|
||||
|
||||
ad7280_delay(st);
|
||||
|
||||
__ad7280_read32(st, &tmp);
|
||||
ret = __ad7280_read32(st, &tmp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ad7280_check_crc(st, tmp))
|
||||
return -EIO;
|
||||
@@ -321,7 +325,9 @@ static int ad7280_read_all_channels(struct ad7280_state *st, unsigned int cnt,
|
||||
ad7280_delay(st);
|
||||
|
||||
for (i = 0; i < cnt; i++) {
|
||||
__ad7280_read32(st, &tmp);
|
||||
ret = __ad7280_read32(st, &tmp);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (ad7280_check_crc(st, tmp))
|
||||
return -EIO;
|
||||
@@ -364,7 +370,10 @@ static int ad7280_chain_setup(struct ad7280_state *st)
|
||||
return ret;
|
||||
|
||||
for (n = 0; n <= AD7280A_MAX_CHAIN; n++) {
|
||||
__ad7280_read32(st, &val);
|
||||
ret = __ad7280_read32(st, &val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
if (val == 0)
|
||||
return n - 1;
|
||||
|
||||
|
||||
@@ -87,12 +87,16 @@ static int ad7780_read_raw(struct iio_dev *indio_dev,
|
||||
long m)
|
||||
{
|
||||
struct ad7780_state *st = iio_priv(indio_dev);
|
||||
int voltage_uv;
|
||||
|
||||
switch (m) {
|
||||
case IIO_CHAN_INFO_RAW:
|
||||
return ad_sigma_delta_single_conversion(indio_dev, chan, val);
|
||||
case IIO_CHAN_INFO_SCALE:
|
||||
*val = st->int_vref_mv * st->gain;
|
||||
voltage_uv = regulator_get_voltage(st->reg);
|
||||
if (voltage_uv < 0)
|
||||
return voltage_uv;
|
||||
*val = (voltage_uv / 1000) * st->gain;
|
||||
*val2 = chan->scan_type.realbits - 1;
|
||||
return IIO_VAL_FRACTIONAL_LOG2;
|
||||
case IIO_CHAN_INFO_OFFSET:
|
||||
|
||||
@@ -86,7 +86,12 @@ static int ad2s90_probe(struct spi_device *spi)
|
||||
/* need 600ns between CS and the first falling edge of SCLK */
|
||||
spi->max_speed_hz = 830000;
|
||||
spi->mode = SPI_MODE_3;
|
||||
spi_setup(spi);
|
||||
ret = spi_setup(spi);
|
||||
|
||||
if (ret < 0) {
|
||||
dev_err(&spi->dev, "spi_setup failed!\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -26,7 +26,7 @@ struct gadc_thermal_info {
|
||||
|
||||
static int gadc_thermal_adc_to_temp(struct gadc_thermal_info *gti, int val)
|
||||
{
|
||||
int temp, adc_hi, adc_lo;
|
||||
int temp, temp_hi, temp_lo, adc_hi, adc_lo;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < gti->nlookup_table; i++) {
|
||||
@@ -36,13 +36,17 @@ static int gadc_thermal_adc_to_temp(struct gadc_thermal_info *gti, int val)
|
||||
|
||||
if (i == 0) {
|
||||
temp = gti->lookup_table[0];
|
||||
} else if (i >= (gti->nlookup_table - 1)) {
|
||||
} else if (i >= gti->nlookup_table) {
|
||||
temp = gti->lookup_table[2 * (gti->nlookup_table - 1)];
|
||||
} else {
|
||||
adc_hi = gti->lookup_table[2 * i - 1];
|
||||
adc_lo = gti->lookup_table[2 * i + 1];
|
||||
temp = gti->lookup_table[2 * i];
|
||||
temp -= ((val - adc_lo) * 1000) / (adc_hi - adc_lo);
|
||||
|
||||
temp_hi = gti->lookup_table[2 * i - 2];
|
||||
temp_lo = gti->lookup_table[2 * i];
|
||||
|
||||
temp = temp_hi + mult_frac(temp_lo - temp_hi, val - adc_hi,
|
||||
adc_lo - adc_hi);
|
||||
}
|
||||
|
||||
return temp;
|
||||
|
||||
@@ -678,16 +678,20 @@ static void update_temperature(struct thermal_zone_device *tz)
|
||||
tz->last_temperature, tz->temperature);
|
||||
}
|
||||
|
||||
static void thermal_zone_device_reset(struct thermal_zone_device *tz)
|
||||
static void thermal_zone_device_init(struct thermal_zone_device *tz)
|
||||
{
|
||||
struct thermal_instance *pos;
|
||||
|
||||
tz->temperature = THERMAL_TEMP_INVALID;
|
||||
tz->passive = 0;
|
||||
list_for_each_entry(pos, &tz->thermal_instances, tz_node)
|
||||
pos->initialized = false;
|
||||
}
|
||||
|
||||
static void thermal_zone_device_reset(struct thermal_zone_device *tz)
|
||||
{
|
||||
tz->passive = 0;
|
||||
thermal_zone_device_init(tz);
|
||||
}
|
||||
|
||||
void thermal_zone_device_update(struct thermal_zone_device *tz,
|
||||
enum thermal_notify_event event)
|
||||
{
|
||||
@@ -2382,7 +2386,7 @@ static int thermal_pm_notify(struct notifier_block *nb,
|
||||
case PM_POST_SUSPEND:
|
||||
atomic_set(&in_suspend, 0);
|
||||
list_for_each_entry(tz, &thermal_tz_list, node) {
|
||||
thermal_zone_device_reset(tz);
|
||||
thermal_zone_device_init(tz);
|
||||
thermal_zone_device_update(tz,
|
||||
THERMAL_EVENT_UNSPECIFIED);
|
||||
}
|
||||
|
||||
@@ -34,13 +34,13 @@
|
||||
int thermal_add_hwmon_sysfs(struct thermal_zone_device *tz);
|
||||
void thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz);
|
||||
#else
|
||||
static int
|
||||
static inline int
|
||||
thermal_add_hwmon_sysfs(struct thermal_zone_device *tz)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
static inline void
|
||||
thermal_remove_hwmon_sysfs(struct thermal_zone_device *tz)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1344,6 +1344,8 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
else
|
||||
cr1 &= ~UARTCR1_PT;
|
||||
}
|
||||
} else {
|
||||
cr1 &= ~UARTCR1_PE;
|
||||
}
|
||||
|
||||
/* ask the core to calculate the divisor */
|
||||
@@ -1487,6 +1489,8 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
|
||||
else
|
||||
ctrl &= ~UARTCTRL_PT;
|
||||
}
|
||||
} else {
|
||||
ctrl &= ~UARTCTRL_PE;
|
||||
}
|
||||
|
||||
/* ask the core to calculate the divisor */
|
||||
|
||||
@@ -1335,11 +1335,14 @@ static void s3c24xx_serial_set_termios(struct uart_port *port,
|
||||
wr_regl(port, S3C2410_ULCON, ulcon);
|
||||
wr_regl(port, S3C2410_UBRDIV, quot);
|
||||
|
||||
port->status &= ~UPSTAT_AUTOCTS;
|
||||
|
||||
umcon = rd_regl(port, S3C2410_UMCON);
|
||||
if (termios->c_cflag & CRTSCTS) {
|
||||
umcon |= S3C2410_UMCOM_AFC;
|
||||
/* Disable RTS when RX FIFO contains 63 bytes */
|
||||
umcon &= ~S3C2412_UMCON_AFC_8;
|
||||
port->status = UPSTAT_AUTOCTS;
|
||||
} else {
|
||||
umcon &= ~S3C2410_UMCOM_AFC;
|
||||
}
|
||||
|
||||
@@ -144,6 +144,9 @@ static void uart_start(struct tty_struct *tty)
|
||||
struct uart_port *port;
|
||||
unsigned long flags;
|
||||
|
||||
if (!state)
|
||||
return;
|
||||
|
||||
port = uart_port_lock(state, flags);
|
||||
__uart_start(tty);
|
||||
uart_port_unlock(port, flags);
|
||||
@@ -720,6 +723,9 @@ static void uart_unthrottle(struct tty_struct *tty)
|
||||
struct uart_port *port;
|
||||
upstat_t mask = 0;
|
||||
|
||||
if (!state)
|
||||
return;
|
||||
|
||||
port = uart_port_ref(state);
|
||||
if (!port)
|
||||
return;
|
||||
|
||||
@@ -1112,6 +1112,16 @@ static void hub_activate(struct usb_hub *hub, enum hub_activation_type type)
|
||||
USB_PORT_FEAT_ENABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Add debounce if USB3 link is in polling/link training state.
|
||||
* Link will automatically transition to Enabled state after
|
||||
* link training completes.
|
||||
*/
|
||||
if (hub_is_superspeed(hdev) &&
|
||||
((portstatus & USB_PORT_STAT_LINK_STATE) ==
|
||||
USB_SS_PORT_LS_POLLING))
|
||||
need_debounce_delay = true;
|
||||
|
||||
/* Clear status-change flags; we'll debounce later */
|
||||
if (portchange & USB_PORT_STAT_C_CONNECTION) {
|
||||
need_debounce_delay = true;
|
||||
|
||||
@@ -2096,7 +2096,7 @@ static irqreturn_t net2272_irq(int irq, void *_dev)
|
||||
#if defined(PLX_PCI_RDK2)
|
||||
/* see if PCI int for us by checking irqstat */
|
||||
intcsr = readl(dev->rdk2.fpga_base_addr + RDK2_IRQSTAT);
|
||||
if (!intcsr & (1 << NET2272_PCI_IRQ)) {
|
||||
if (!(intcsr & (1 << NET2272_PCI_IRQ))) {
|
||||
spin_unlock(&dev->lock);
|
||||
return IRQ_NONE;
|
||||
}
|
||||
|
||||
@@ -477,13 +477,10 @@ void musb_g_tx(struct musb *musb, u8 epnum)
|
||||
}
|
||||
|
||||
if (request) {
|
||||
u8 is_dma = 0;
|
||||
bool short_packet = false;
|
||||
|
||||
trace_musb_req_tx(req);
|
||||
|
||||
if (dma && (csr & MUSB_TXCSR_DMAENAB)) {
|
||||
is_dma = 1;
|
||||
csr |= MUSB_TXCSR_P_WZC_BITS;
|
||||
csr &= ~(MUSB_TXCSR_DMAENAB | MUSB_TXCSR_P_UNDERRUN |
|
||||
MUSB_TXCSR_TXPKTRDY | MUSB_TXCSR_AUTOSET);
|
||||
@@ -501,16 +498,8 @@ void musb_g_tx(struct musb *musb, u8 epnum)
|
||||
*/
|
||||
if ((request->zero && request->length)
|
||||
&& (request->length % musb_ep->packet_sz == 0)
|
||||
&& (request->actual == request->length))
|
||||
short_packet = true;
|
||||
&& (request->actual == request->length)) {
|
||||
|
||||
if ((musb_dma_inventra(musb) || musb_dma_ux500(musb)) &&
|
||||
(is_dma && (!dma->desired_mode ||
|
||||
(request->actual &
|
||||
(musb_ep->packet_sz - 1)))))
|
||||
short_packet = true;
|
||||
|
||||
if (short_packet) {
|
||||
/*
|
||||
* On DMA completion, FIFO may not be
|
||||
* available yet...
|
||||
|
||||
@@ -320,12 +320,10 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
|
||||
channel->status = MUSB_DMA_STATUS_FREE;
|
||||
|
||||
/* completed */
|
||||
if ((devctl & MUSB_DEVCTL_HM)
|
||||
&& (musb_channel->transmit)
|
||||
&& ((channel->desired_mode == 0)
|
||||
|| (channel->actual_len &
|
||||
(musb_channel->max_packet_sz - 1)))
|
||||
) {
|
||||
if (musb_channel->transmit &&
|
||||
(!channel->desired_mode ||
|
||||
(channel->actual_len %
|
||||
musb_channel->max_packet_sz))) {
|
||||
u8 epnum = musb_channel->epnum;
|
||||
int offset = musb->io.ep_offset(epnum,
|
||||
MUSB_TXCSR);
|
||||
@@ -337,11 +335,14 @@ static irqreturn_t dma_controller_irq(int irq, void *private_data)
|
||||
*/
|
||||
musb_ep_select(mbase, epnum);
|
||||
txcsr = musb_readw(mbase, offset);
|
||||
txcsr &= ~(MUSB_TXCSR_DMAENAB
|
||||
if (channel->desired_mode == 1) {
|
||||
txcsr &= ~(MUSB_TXCSR_DMAENAB
|
||||
| MUSB_TXCSR_AUTOSET);
|
||||
musb_writew(mbase, offset, txcsr);
|
||||
/* Send out the packet */
|
||||
txcsr &= ~MUSB_TXCSR_DMAMODE;
|
||||
musb_writew(mbase, offset, txcsr);
|
||||
/* Send out the packet */
|
||||
txcsr &= ~MUSB_TXCSR_DMAMODE;
|
||||
txcsr |= MUSB_TXCSR_DMAENAB;
|
||||
}
|
||||
txcsr |= MUSB_TXCSR_TXPKTRDY;
|
||||
musb_writew(mbase, offset, txcsr);
|
||||
}
|
||||
|
||||
@@ -60,9 +60,6 @@ static int am335x_phy_probe(struct platform_device *pdev)
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
ret = usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
|
||||
if (ret)
|
||||
return ret;
|
||||
am_phy->usb_phy_gen.phy.init = am335x_init;
|
||||
am_phy->usb_phy_gen.phy.shutdown = am335x_shutdown;
|
||||
|
||||
@@ -81,7 +78,7 @@ static int am335x_phy_probe(struct platform_device *pdev)
|
||||
device_set_wakeup_enable(dev, false);
|
||||
phy_ctrl_power(am_phy->phy_ctrl, am_phy->id, am_phy->dr_mode, false);
|
||||
|
||||
return 0;
|
||||
return usb_add_phy_dev(&am_phy->usb_phy_gen.phy);
|
||||
}
|
||||
|
||||
static int am335x_phy_remove(struct platform_device *pdev)
|
||||
|
||||
@@ -3030,7 +3030,7 @@ static int fbcon_fb_unbind(int idx)
|
||||
for (i = first_fb_vc; i <= last_fb_vc; i++) {
|
||||
if (con2fb_map[i] != idx &&
|
||||
con2fb_map[i] != -1) {
|
||||
new_idx = i;
|
||||
new_idx = con2fb_map[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user