Merge 4.19.311 into android-4.19-stable
Changes in 4.19.311 ASoC: rt5645: Make LattePanda board DMI match more precise x86/xen: Add some null pointer checking to smp.c MIPS: Clear Cause.BD in instruction_pointer_set net/iucv: fix the allocation size of iucv_path_table array block: sed-opal: handle empty atoms when parsing response dm-verity, dm-crypt: align "struct bvec_iter" correctly scsi: mpt3sas: Prevent sending diag_reset when the controller is ready Bluetooth: rfcomm: Fix null-ptr-deref in rfcomm_check_security firewire: core: use long bus reset on gap count error ASoC: Intel: bytcr_rt5640: Add an extra entry for the Chuwi Vi8 tablet Input: gpio_keys_polled - suppress deferred probe error for gpio ASoC: wm8962: Enable oscillator if selecting WM8962_FLL_OSC ASoC: wm8962: Enable both SPKOUTR_ENA and SPKOUTL_ENA in mono mode ASoC: wm8962: Fix up incorrect error message in wm8962_set_fll crypto: algif_aead - fix uninitialized ctx->init crypto: af_alg - make some functions static crypto: algif_aead - Only wake up when ctx->more is zero do_sys_name_to_handle(): use kzalloc() to fix kernel-infoleak fs/select: rework stack allocation hack for clang md: switch to ->check_events for media change notifications block: add a new set_read_only method md: implement ->set_read_only to hook into BLKROSET processing md: Don't clear MD_CLOSING when the raid is about to stop aoe: fix the potential use-after-free problem in aoecmd_cfg_pkts timekeeping: Fix cross-timestamp interpolation on counter wrap timekeeping: Fix cross-timestamp interpolation corner case decision timekeeping: Fix cross-timestamp interpolation for non-x86 wifi: ath10k: fix NULL pointer dereference in ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev() b43: dma: Fix use true/false for bool type variable wifi: b43: Stop/wake correct queue in DMA Tx path when QoS is disabled wifi: b43: Stop/wake correct queue in PIO Tx path when QoS is disabled b43: main: Fix use true/false for bool type wifi: b43: Stop correct queue in DMA worker when QoS is disabled wifi: b43: Disable QoS for bcm4331 wifi: mwifiex: debugfs: Drop unnecessary error check for debugfs_create_dir() sock_diag: annotate data-races around sock_diag_handlers[family] af_unix: Annotate data-race of gc_in_progress in wait_for_unix_gc(). wifi: libertas: fix some memleaks in lbs_allocate_cmd_buffer() ACPI: processor_idle: Fix memory leak in acpi_processor_power_exit() bus: tegra-aconnect: Update dependency to ARCH_TEGRA iommu/amd: Mark interrupt as managed wifi: brcmsmac: avoid function pointer casts ARM: dts: arm: realview: Fix development chip ROM compatible value ACPI: scan: Fix device check notification handling x86, relocs: Ignore relocations in .notes section SUNRPC: fix some memleaks in gssx_dec_option_array mmc: wmt-sdmmc: remove an incorrect release_mem_region() call in the .remove function igb: move PEROUT and EXTTS isr logic to separate functions igb: Fix missing time sync events Bluetooth: Remove superfluous call to hci_conn_check_pending() Bluetooth: hci_core: Fix possible buffer overflow sr9800: Add check for usbnet_get_endpoints bpf: Fix hashtab overflow check on 32-bit arches bpf: Fix stackmap overflow check on 32-bit arches ipv6: fib6_rules: flush route cache when rule is changed tcp: fix incorrect parameter validation in the do_tcp_getsockopt() function l2tp: fix incorrect parameter validation in the pppol2tp_getsockopt() function udp: fix incorrect parameter validation in the udp_lib_getsockopt() function net: kcm: fix incorrect parameter validation in the kcm_getsockopt) function net/x25: fix incorrect parameter validation in the x25_getsockopt() function nfp: flower: handle acti_netdevs allocation failure dm raid: fix false positive for requeue needed during reshape dm: call the resume method on internal suspend drm/tegra: dsi: Add missing check for of_find_device_by_node gpu: host1x: mipi: Update tegra_mipi_request() to be node based drm/tegra: dsi: Make use of the helper function dev_err_probe() drm/tegra: dsi: Fix some error handling paths in tegra_dsi_probe() drm/tegra: dsi: Fix missing pm_runtime_disable() in the error handling path of tegra_dsi_probe() drm/rockchip: inno_hdmi: Fix video timing drm: Don't treat 0 as -1 in drm_fixp2int_ceil drm/rockchip: lvds: do not overwrite error code drm/rockchip: lvds: do not print scary message when probing defer media: tc358743: register v4l2 async device only after successful setup perf evsel: Fix duplicate initialization of data->id in evsel__parse_sample() ABI: sysfs-bus-pci-devices-aer_stats uses an invalid tag media: em28xx: annotate unchecked call to media_device_register() media: v4l2-tpg: fix some memleaks in tpg_alloc media: v4l2-mem2mem: fix a memleak in v4l2_m2m_register_entity media: dvbdev: remove double-unlock media: media/dvb: Use kmemdup rather than duplicating its implementation media: dvbdev: Fix memleak in dvb_register_device media: dvbdev: fix error logic at dvb_register_device() media: dvb-core: Fix use-after-free due to race at dvb_register_device() media: edia: dvbdev: fix a use-after-free clk: qcom: reset: Allow specifying custom reset delay clk: qcom: reset: support resetting multiple bits clk: qcom: reset: Commonize the de/assert functions clk: qcom: reset: Ensure write completion on reset de/assertion quota: code cleanup for __dquot_alloc_space() fs/quota: erase unused but set variable warning quota: check time limit when back out space/inode change quota: simplify drop_dquot_ref() quota: Fix potential NULL pointer dereference quota: Fix rcu annotations of inode dquot pointers perf thread_map: Free strlist on normal path in thread_map__new_by_tid_str() drm/radeon/ni: Fix wrong firmware size logging in ni_init_microcode() ALSA: seq: fix function cast warnings media: go7007: add check of return value of go7007_read_addr() media: pvrusb2: fix pvr2_stream_callback casts firmware: qcom: scm: Add WLAN VMID for Qualcomm SCM interface clk: qcom: dispcc-sdm845: Adjust internal GDSC wait times drm/mediatek: dsi: Fix DSI RGB666 formats and definitions PCI: Mark 3ware-9650SE Root Port Extended Tags as broken clk: hisilicon: hi3519: Release the correct number of gates in hi3519_clk_unregister() drm/tegra: put drm_gem_object ref on error in tegra_fb_create mfd: syscon: Call of_node_put() only when of_parse_phandle() takes a ref crypto: arm - Rename functions to avoid conflict with crypto/sha256.h crypto: arm/sha - fix function cast warnings mtd: rawnand: lpc32xx_mlc: fix irq handler prototype ASoC: meson: axg-tdm-interface: fix mclk setup without mclk-fs drm/amdgpu: Fix missing break in ATOM_ARG_IMM Case of atom_get_src_int() media: pvrusb2: fix uaf in pvr2_context_set_notify media: dvb-frontends: avoid stack overflow warnings with clang media: go7007: fix a memleak in go7007_load_encoder drm/mediatek: Fix a null pointer crash in mtk_drm_crtc_finish_page_flip powerpc/hv-gpci: Fix the H_GET_PERF_COUNTER_INFO hcall return value checks powerpc/embedded6xx: Fix no previous prototype for avr_uart_send() etc. backlight: lm3630a: Initialize backlight_properties on init backlight: lm3630a: Don't set bl->props.brightness in get_brightness backlight: da9052: Fully initialize backlight_properties during probe backlight: lm3639: Fully initialize backlight_properties during probe backlight: lp8788: Fully initialize backlight_properties during probe sparc32: Fix section mismatch in leon_pci_grpci ALSA: usb-audio: Stop parsing channels bits when all channels are found. scsi: csiostor: Avoid function pointer casts scsi: bfa: Fix function pointer type mismatch for hcb_qe->cbfn net: sunrpc: Fix an off by one in rpc_sockaddr2uaddr() NFS: Fix an off by one in root_nfs_cat() clk: qcom: gdsc: Add support to update GDSC transition delay serial: max310x: fix syntax error in IRQ error message tty: serial: samsung: fix tx_empty() to return TIOCSER_TEMT kconfig: fix infinite loop when expanding a macro at the end of file rtc: mt6397: select IRQ_DOMAIN instead of depending on it serial: 8250_exar: Don't remove GPIO device on suspend staging: greybus: fix get_channel_from_mode() failure path usb: gadget: net2272: Use irqflags in the call to net2272_probe_fin net: hsr: fix placement of logical operator in a multi-line statement hsr: Fix uninit-value access in hsr_get_node() rds: introduce acquire/release ordering in acquire/release_in_xmit() hsr: Handle failures in module init net/bnx2x: Prevent access to a freed page in page_pool spi: spi-mt65xx: Fix NULL pointer access in interrupt handler crypto: af_alg - Fix regression on empty requests crypto: af_alg - Work around empty control messages without MSG_MORE Linux 4.19.311 Change-Id: I034e9a44b6dec1a7b5c600b3cd77aabc401044d7 Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -9,7 +9,7 @@ errors may be "seen" / reported by the link partner and not the
|
||||
problematic endpoint itself (which may report all counters as 0 as it never
|
||||
saw any problems).
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/aer_dev_correctable
|
||||
What: /sys/bus/pci/devices/<dev>/aer_dev_correctable
|
||||
Date: July 2018
|
||||
Kernel Version: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
@@ -31,7 +31,7 @@ Header Log Overflow 0
|
||||
TOTAL_ERR_COR 2
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/aer_dev_fatal
|
||||
What: /sys/bus/pci/devices/<dev>/aer_dev_fatal
|
||||
Date: July 2018
|
||||
Kernel Version: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
@@ -62,7 +62,7 @@ TLP Prefix Blocked Error 0
|
||||
TOTAL_ERR_FATAL 0
|
||||
-------------------------------------------------------------------------
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/aer_dev_nonfatal
|
||||
What: /sys/bus/pci/devices/<dev>/aer_dev_nonfatal
|
||||
Date: July 2018
|
||||
Kernel Version: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
@@ -103,19 +103,19 @@ collectors) that are AER capable. These indicate the number of error messages as
|
||||
device, so these counters include them and are thus cumulative of all the error
|
||||
messages on the PCI hierarchy originating at that root port.
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_cor
|
||||
What: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_cor
|
||||
Date: July 2018
|
||||
Kernel Version: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: Total number of ERR_COR messages reported to rootport.
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_fatal
|
||||
What: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_fatal
|
||||
Date: July 2018
|
||||
Kernel Version: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
Description: Total number of ERR_FATAL messages reported to rootport.
|
||||
|
||||
Where: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_nonfatal
|
||||
What: /sys/bus/pci/devices/<dev>/aer_stats/aer_rootport_total_err_nonfatal
|
||||
Date: July 2018
|
||||
Kernel Version: 4.19.0
|
||||
Contact: linux-pci@vger.kernel.org, rajatja@google.com
|
||||
|
||||
@@ -404,7 +404,6 @@ prototypes:
|
||||
int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long);
|
||||
int (*direct_access) (struct block_device *, sector_t, void **,
|
||||
unsigned long *);
|
||||
int (*media_changed) (struct gendisk *);
|
||||
void (*unlock_native_capacity) (struct gendisk *);
|
||||
int (*revalidate_disk) (struct gendisk *);
|
||||
int (*getgeo)(struct block_device *, struct hd_geometry *);
|
||||
@@ -417,13 +416,12 @@ release: yes
|
||||
ioctl: no
|
||||
compat_ioctl: no
|
||||
direct_access: no
|
||||
media_changed: no
|
||||
unlock_native_capacity: no
|
||||
revalidate_disk: no
|
||||
getgeo: no
|
||||
swap_slot_free_notify: no (see below)
|
||||
|
||||
media_changed, unlock_native_capacity and revalidate_disk are called only from
|
||||
unlock_native_capacity and revalidate_disk are called only from
|
||||
check_disk_change().
|
||||
|
||||
swap_slot_free_notify is called with swap_lock and sometimes the page lock
|
||||
|
||||
2
Makefile
2
Makefile
@@ -1,7 +1,7 @@
|
||||
# SPDX-License-Identifier: GPL-2.0
|
||||
VERSION = 4
|
||||
PATCHLEVEL = 19
|
||||
SUBLEVEL = 310
|
||||
SUBLEVEL = 311
|
||||
EXTRAVERSION =
|
||||
NAME = "People's Front"
|
||||
|
||||
|
||||
@@ -427,7 +427,7 @@
|
||||
|
||||
/* Direct-mapped development chip ROM */
|
||||
pb1176_rom@10200000 {
|
||||
compatible = "direct-mapped";
|
||||
compatible = "mtd-rom";
|
||||
reg = <0x10200000 0x4000>;
|
||||
bank-width = <1>;
|
||||
};
|
||||
|
||||
@@ -30,8 +30,8 @@
|
||||
|
||||
#include "sha256_glue.h"
|
||||
|
||||
asmlinkage void sha256_block_data_order(u32 *digest, const void *data,
|
||||
unsigned int num_blks);
|
||||
asmlinkage void sha256_block_data_order(struct sha256_state *state,
|
||||
const u8 *data, int num_blks);
|
||||
|
||||
int crypto_sha256_arm_update(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len)
|
||||
@@ -39,24 +39,21 @@ int crypto_sha256_arm_update(struct shash_desc *desc, const u8 *data,
|
||||
/* make sure casting to sha256_block_fn() is safe */
|
||||
BUILD_BUG_ON(offsetof(struct sha256_state, state) != 0);
|
||||
|
||||
return sha256_base_do_update(desc, data, len,
|
||||
(sha256_block_fn *)sha256_block_data_order);
|
||||
return sha256_base_do_update(desc, data, len, sha256_block_data_order);
|
||||
}
|
||||
EXPORT_SYMBOL(crypto_sha256_arm_update);
|
||||
|
||||
static int sha256_final(struct shash_desc *desc, u8 *out)
|
||||
static int crypto_sha256_arm_final(struct shash_desc *desc, u8 *out)
|
||||
{
|
||||
sha256_base_do_finalize(desc,
|
||||
(sha256_block_fn *)sha256_block_data_order);
|
||||
sha256_base_do_finalize(desc, sha256_block_data_order);
|
||||
return sha256_base_finish(desc, out);
|
||||
}
|
||||
|
||||
int crypto_sha256_arm_finup(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len, u8 *out)
|
||||
{
|
||||
sha256_base_do_update(desc, data, len,
|
||||
(sha256_block_fn *)sha256_block_data_order);
|
||||
return sha256_final(desc, out);
|
||||
sha256_base_do_update(desc, data, len, sha256_block_data_order);
|
||||
return crypto_sha256_arm_final(desc, out);
|
||||
}
|
||||
EXPORT_SYMBOL(crypto_sha256_arm_finup);
|
||||
|
||||
@@ -64,7 +61,7 @@ static struct shash_alg algs[] = { {
|
||||
.digestsize = SHA256_DIGEST_SIZE,
|
||||
.init = sha256_base_init,
|
||||
.update = crypto_sha256_arm_update,
|
||||
.final = sha256_final,
|
||||
.final = crypto_sha256_arm_final,
|
||||
.finup = crypto_sha256_arm_finup,
|
||||
.descsize = sizeof(struct sha256_state),
|
||||
.base = {
|
||||
@@ -78,7 +75,7 @@ static struct shash_alg algs[] = { {
|
||||
.digestsize = SHA224_DIGEST_SIZE,
|
||||
.init = sha224_base_init,
|
||||
.update = crypto_sha256_arm_update,
|
||||
.final = sha256_final,
|
||||
.final = crypto_sha256_arm_final,
|
||||
.finup = crypto_sha256_arm_finup,
|
||||
.descsize = sizeof(struct sha256_state),
|
||||
.base = {
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
asmlinkage void sha256_block_data_order_neon(u32 *digest, const void *data,
|
||||
unsigned int num_blks);
|
||||
|
||||
static int sha256_update(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len)
|
||||
static int crypto_sha256_neon_update(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len)
|
||||
{
|
||||
struct sha256_state *sctx = shash_desc_ctx(desc);
|
||||
|
||||
@@ -46,8 +46,8 @@ static int sha256_update(struct shash_desc *desc, const u8 *data,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int sha256_finup(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len, u8 *out)
|
||||
static int crypto_sha256_neon_finup(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len, u8 *out)
|
||||
{
|
||||
if (!may_use_simd())
|
||||
return crypto_sha256_arm_finup(desc, data, len, out);
|
||||
@@ -63,17 +63,17 @@ static int sha256_finup(struct shash_desc *desc, const u8 *data,
|
||||
return sha256_base_finish(desc, out);
|
||||
}
|
||||
|
||||
static int sha256_final(struct shash_desc *desc, u8 *out)
|
||||
static int crypto_sha256_neon_final(struct shash_desc *desc, u8 *out)
|
||||
{
|
||||
return sha256_finup(desc, NULL, 0, out);
|
||||
return crypto_sha256_neon_finup(desc, NULL, 0, out);
|
||||
}
|
||||
|
||||
struct shash_alg sha256_neon_algs[] = { {
|
||||
.digestsize = SHA256_DIGEST_SIZE,
|
||||
.init = sha256_base_init,
|
||||
.update = sha256_update,
|
||||
.final = sha256_final,
|
||||
.finup = sha256_finup,
|
||||
.update = crypto_sha256_neon_update,
|
||||
.final = crypto_sha256_neon_final,
|
||||
.finup = crypto_sha256_neon_finup,
|
||||
.descsize = sizeof(struct sha256_state),
|
||||
.base = {
|
||||
.cra_name = "sha256",
|
||||
@@ -85,9 +85,9 @@ struct shash_alg sha256_neon_algs[] = { {
|
||||
}, {
|
||||
.digestsize = SHA224_DIGEST_SIZE,
|
||||
.init = sha224_base_init,
|
||||
.update = sha256_update,
|
||||
.final = sha256_final,
|
||||
.finup = sha256_finup,
|
||||
.update = crypto_sha256_neon_update,
|
||||
.final = crypto_sha256_neon_final,
|
||||
.finup = crypto_sha256_neon_finup,
|
||||
.descsize = sizeof(struct sha256_state),
|
||||
.base = {
|
||||
.cra_name = "sha224",
|
||||
|
||||
@@ -28,27 +28,25 @@ MODULE_ALIAS_CRYPTO("sha512");
|
||||
MODULE_ALIAS_CRYPTO("sha384-arm");
|
||||
MODULE_ALIAS_CRYPTO("sha512-arm");
|
||||
|
||||
asmlinkage void sha512_block_data_order(u64 *state, u8 const *src, int blocks);
|
||||
asmlinkage void sha512_block_data_order(struct sha512_state *state,
|
||||
u8 const *src, int blocks);
|
||||
|
||||
int sha512_arm_update(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len)
|
||||
{
|
||||
return sha512_base_do_update(desc, data, len,
|
||||
(sha512_block_fn *)sha512_block_data_order);
|
||||
return sha512_base_do_update(desc, data, len, sha512_block_data_order);
|
||||
}
|
||||
|
||||
int sha512_arm_final(struct shash_desc *desc, u8 *out)
|
||||
{
|
||||
sha512_base_do_finalize(desc,
|
||||
(sha512_block_fn *)sha512_block_data_order);
|
||||
sha512_base_do_finalize(desc, sha512_block_data_order);
|
||||
return sha512_base_finish(desc, out);
|
||||
}
|
||||
|
||||
int sha512_arm_finup(struct shash_desc *desc, const u8 *data,
|
||||
unsigned int len, u8 *out)
|
||||
{
|
||||
sha512_base_do_update(desc, data, len,
|
||||
(sha512_block_fn *)sha512_block_data_order);
|
||||
sha512_base_do_update(desc, data, len, sha512_block_data_order);
|
||||
return sha512_arm_final(desc, out);
|
||||
}
|
||||
|
||||
|
||||
@@ -65,6 +65,7 @@ static inline void instruction_pointer_set(struct pt_regs *regs,
|
||||
unsigned long val)
|
||||
{
|
||||
regs->cp0_epc = val;
|
||||
regs->cp0_cause &= ~CAUSEF_BD;
|
||||
}
|
||||
|
||||
/* Query offset/name of register from its name/offset */
|
||||
|
||||
@@ -157,6 +157,20 @@ static unsigned long single_gpci_request(u32 req, u32 starting_index,
|
||||
|
||||
ret = plpar_hcall_norets(H_GET_PERF_COUNTER_INFO,
|
||||
virt_to_phys(arg), HGPCI_REQ_BUFFER_SIZE);
|
||||
|
||||
/*
|
||||
* ret value as 'H_PARAMETER' with detail_rc as 'GEN_BUF_TOO_SMALL',
|
||||
* specifies that the current buffer size cannot accommodate
|
||||
* all the information and a partial buffer returned.
|
||||
* Since in this function we are only accessing data for a given starting index,
|
||||
* we don't need to accommodate whole data and can get required count by
|
||||
* accessing first entry data.
|
||||
* Hence hcall fails only incase the ret value is other than H_SUCCESS or
|
||||
* H_PARAMETER with detail_rc value as GEN_BUF_TOO_SMALL(0x1B).
|
||||
*/
|
||||
if (ret == H_PARAMETER && be32_to_cpu(arg->params.detail_rc) == 0x1B)
|
||||
ret = 0;
|
||||
|
||||
if (ret) {
|
||||
pr_devel("hcall failed: 0x%lx\n", ret);
|
||||
goto out;
|
||||
@@ -221,6 +235,7 @@ static int h_gpci_event_init(struct perf_event *event)
|
||||
{
|
||||
u64 count;
|
||||
u8 length;
|
||||
unsigned long ret;
|
||||
|
||||
/* Not our event */
|
||||
if (event->attr.type != event->pmu->type)
|
||||
@@ -260,13 +275,23 @@ static int h_gpci_event_init(struct perf_event *event)
|
||||
}
|
||||
|
||||
/* check if the request works... */
|
||||
if (single_gpci_request(event_get_request(event),
|
||||
ret = single_gpci_request(event_get_request(event),
|
||||
event_get_starting_index(event),
|
||||
event_get_secondary_index(event),
|
||||
event_get_counter_info_version(event),
|
||||
event_get_offset(event),
|
||||
length,
|
||||
&count)) {
|
||||
&count);
|
||||
|
||||
/*
|
||||
* ret value as H_AUTHORITY implies that partition is not permitted to retrieve
|
||||
* performance information, and required to set
|
||||
* "Enable Performance Information Collection" option.
|
||||
*/
|
||||
if (ret == H_AUTHORITY)
|
||||
return -EPERM;
|
||||
|
||||
if (ret) {
|
||||
pr_devel("gpci hcall failed\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
@@ -97,9 +97,6 @@ static void __init linkstation_init_IRQ(void)
|
||||
mpic_init(mpic);
|
||||
}
|
||||
|
||||
extern void avr_uart_configure(void);
|
||||
extern void avr_uart_send(const char);
|
||||
|
||||
static void __noreturn linkstation_restart(char *cmd)
|
||||
{
|
||||
local_irq_disable();
|
||||
|
||||
@@ -156,4 +156,7 @@ int mpc10x_disable_store_gathering(struct pci_controller *hose);
|
||||
/* For MPC107 boards that use the built-in openpic */
|
||||
void mpc10x_set_openpic(void);
|
||||
|
||||
void avr_uart_configure(void);
|
||||
void avr_uart_send(const char c);
|
||||
|
||||
#endif /* __PPC_KERNEL_MPC10X_H */
|
||||
|
||||
@@ -696,7 +696,7 @@ err1:
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct of_device_id grpci1_of_match[] __initconst = {
|
||||
static const struct of_device_id grpci1_of_match[] = {
|
||||
{
|
||||
.name = "GAISLER_PCIFBRG",
|
||||
},
|
||||
|
||||
@@ -887,7 +887,7 @@ err1:
|
||||
return err;
|
||||
}
|
||||
|
||||
static const struct of_device_id grpci2_of_match[] __initconst = {
|
||||
static const struct of_device_id grpci2_of_match[] = {
|
||||
{
|
||||
.name = "GAISLER_GRPCI2",
|
||||
},
|
||||
|
||||
@@ -580,6 +580,14 @@ static void print_absolute_relocs(void)
|
||||
if (!(sec_applies->shdr.sh_flags & SHF_ALLOC)) {
|
||||
continue;
|
||||
}
|
||||
/*
|
||||
* Do not perform relocations in .notes section; any
|
||||
* values there are meant for pre-boot consumption (e.g.
|
||||
* startup_xen).
|
||||
*/
|
||||
if (sec_applies->shdr.sh_type == SHT_NOTE) {
|
||||
continue;
|
||||
}
|
||||
sh_symtab = sec_symtab->symtab;
|
||||
sym_strtab = sec_symtab->link->strtab;
|
||||
for (j = 0; j < sec->shdr.sh_size/sizeof(Elf_Rel); j++) {
|
||||
|
||||
@@ -65,6 +65,8 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
char *resched_name, *callfunc_name, *debug_name;
|
||||
|
||||
resched_name = kasprintf(GFP_KERNEL, "resched%d", cpu);
|
||||
if (!resched_name)
|
||||
goto fail_mem;
|
||||
per_cpu(xen_resched_irq, cpu).name = resched_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_RESCHEDULE_VECTOR,
|
||||
cpu,
|
||||
@@ -77,6 +79,8 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
per_cpu(xen_resched_irq, cpu).irq = rc;
|
||||
|
||||
callfunc_name = kasprintf(GFP_KERNEL, "callfunc%d", cpu);
|
||||
if (!callfunc_name)
|
||||
goto fail_mem;
|
||||
per_cpu(xen_callfunc_irq, cpu).name = callfunc_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_VECTOR,
|
||||
cpu,
|
||||
@@ -90,6 +94,9 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
|
||||
if (!xen_fifo_events) {
|
||||
debug_name = kasprintf(GFP_KERNEL, "debug%d", cpu);
|
||||
if (!debug_name)
|
||||
goto fail_mem;
|
||||
|
||||
per_cpu(xen_debug_irq, cpu).name = debug_name;
|
||||
rc = bind_virq_to_irqhandler(VIRQ_DEBUG, cpu,
|
||||
xen_debug_interrupt,
|
||||
@@ -101,6 +108,9 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
}
|
||||
|
||||
callfunc_name = kasprintf(GFP_KERNEL, "callfuncsingle%d", cpu);
|
||||
if (!callfunc_name)
|
||||
goto fail_mem;
|
||||
|
||||
per_cpu(xen_callfuncsingle_irq, cpu).name = callfunc_name;
|
||||
rc = bind_ipi_to_irqhandler(XEN_CALL_FUNCTION_SINGLE_VECTOR,
|
||||
cpu,
|
||||
@@ -114,6 +124,8 @@ int xen_smp_intr_init(unsigned int cpu)
|
||||
|
||||
return 0;
|
||||
|
||||
fail_mem:
|
||||
rc = -ENOMEM;
|
||||
fail:
|
||||
xen_smp_intr_free(cpu);
|
||||
return rc;
|
||||
|
||||
@@ -1762,18 +1762,12 @@ void disk_flush_events(struct gendisk *disk, unsigned int mask)
|
||||
*/
|
||||
unsigned int disk_clear_events(struct gendisk *disk, unsigned int mask)
|
||||
{
|
||||
const struct block_device_operations *bdops = disk->fops;
|
||||
struct disk_events *ev = disk->ev;
|
||||
unsigned int pending;
|
||||
unsigned int clearing = mask;
|
||||
|
||||
if (!ev) {
|
||||
/* for drivers still using the old ->media_changed method */
|
||||
if ((mask & DISK_EVENT_MEDIA_CHANGE) &&
|
||||
bdops->media_changed && bdops->media_changed(disk))
|
||||
return DISK_EVENT_MEDIA_CHANGE;
|
||||
if (!ev)
|
||||
return 0;
|
||||
}
|
||||
|
||||
disk_block_events(disk);
|
||||
|
||||
|
||||
@@ -451,6 +451,11 @@ static int blkdev_roset(struct block_device *bdev, fmode_t mode,
|
||||
return ret;
|
||||
if (get_user(n, (int __user *)arg))
|
||||
return -EFAULT;
|
||||
if (bdev->bd_disk->fops->set_read_only) {
|
||||
ret = bdev->bd_disk->fops->set_read_only(bdev, n);
|
||||
if (ret)
|
||||
return ret;
|
||||
}
|
||||
set_device_ro(bdev, n);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -73,6 +73,7 @@ enum opal_response_token {
|
||||
#define SHORT_ATOM_BYTE 0xBF
|
||||
#define MEDIUM_ATOM_BYTE 0xDF
|
||||
#define LONG_ATOM_BYTE 0xE3
|
||||
#define EMPTY_ATOM_BYTE 0xFF
|
||||
|
||||
#define OPAL_INVAL_PARAM 12
|
||||
#define OPAL_MANUFACTURED_INACTIVE 0x08
|
||||
|
||||
@@ -844,16 +844,20 @@ static int response_parse(const u8 *buf, size_t length,
|
||||
token_length = response_parse_medium(iter, pos);
|
||||
else if (pos[0] <= LONG_ATOM_BYTE) /* long atom */
|
||||
token_length = response_parse_long(iter, pos);
|
||||
else if (pos[0] == EMPTY_ATOM_BYTE) /* empty atom */
|
||||
token_length = 1;
|
||||
else /* TOKEN */
|
||||
token_length = response_parse_token(iter, pos);
|
||||
|
||||
if (token_length < 0)
|
||||
return token_length;
|
||||
|
||||
if (pos[0] != EMPTY_ATOM_BYTE)
|
||||
num_entries++;
|
||||
|
||||
pos += token_length;
|
||||
total -= token_length;
|
||||
iter++;
|
||||
num_entries++;
|
||||
}
|
||||
|
||||
if (num_entries == 0) {
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
#include <linux/module.h>
|
||||
#include <linux/net.h>
|
||||
#include <linux/rwsem.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/sched/signal.h>
|
||||
#include <linux/security.h>
|
||||
|
||||
@@ -429,12 +430,12 @@ int af_alg_make_sg(struct af_alg_sgl *sgl, struct iov_iter *iter, int len)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_make_sg);
|
||||
|
||||
void af_alg_link_sg(struct af_alg_sgl *sgl_prev, struct af_alg_sgl *sgl_new)
|
||||
static void af_alg_link_sg(struct af_alg_sgl *sgl_prev,
|
||||
struct af_alg_sgl *sgl_new)
|
||||
{
|
||||
sg_unmark_end(sgl_prev->sg + sgl_prev->npages - 1);
|
||||
sg_chain(sgl_prev->sg, sgl_prev->npages + 1, sgl_new->sg);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_link_sg);
|
||||
|
||||
void af_alg_free_sg(struct af_alg_sgl *sgl)
|
||||
{
|
||||
@@ -445,7 +446,7 @@ void af_alg_free_sg(struct af_alg_sgl *sgl)
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_free_sg);
|
||||
|
||||
int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
|
||||
static int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
|
||||
{
|
||||
struct cmsghdr *cmsg;
|
||||
|
||||
@@ -484,7 +485,6 @@ int af_alg_cmsg_send(struct msghdr *msg, struct af_alg_control *con)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_cmsg_send);
|
||||
|
||||
/**
|
||||
* af_alg_alloc_tsgl - allocate the TX SGL
|
||||
@@ -492,7 +492,7 @@ EXPORT_SYMBOL_GPL(af_alg_cmsg_send);
|
||||
* @sk socket of connection to user space
|
||||
* @return: 0 upon success, < 0 upon error
|
||||
*/
|
||||
int af_alg_alloc_tsgl(struct sock *sk)
|
||||
static int af_alg_alloc_tsgl(struct sock *sk)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct af_alg_ctx *ctx = ask->private;
|
||||
@@ -521,7 +521,6 @@ int af_alg_alloc_tsgl(struct sock *sk)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_alloc_tsgl);
|
||||
|
||||
/**
|
||||
* aead_count_tsgl - Count number of TX SG entries
|
||||
@@ -650,6 +649,7 @@ void af_alg_pull_tsgl(struct sock *sk, size_t used, struct scatterlist *dst,
|
||||
|
||||
if (!ctx->used)
|
||||
ctx->merge = 0;
|
||||
ctx->init = ctx->more;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_pull_tsgl);
|
||||
|
||||
@@ -658,7 +658,7 @@ EXPORT_SYMBOL_GPL(af_alg_pull_tsgl);
|
||||
*
|
||||
* @areq Request holding the TX and RX SGL
|
||||
*/
|
||||
void af_alg_free_areq_sgls(struct af_alg_async_req *areq)
|
||||
static void af_alg_free_areq_sgls(struct af_alg_async_req *areq)
|
||||
{
|
||||
struct sock *sk = areq->sk;
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
@@ -687,7 +687,6 @@ void af_alg_free_areq_sgls(struct af_alg_async_req *areq)
|
||||
sock_kfree_s(sk, tsgl, areq->tsgl_entries * sizeof(*tsgl));
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_free_areq_sgls);
|
||||
|
||||
/**
|
||||
* af_alg_wait_for_wmem - wait for availability of writable memory
|
||||
@@ -696,7 +695,7 @@ EXPORT_SYMBOL_GPL(af_alg_free_areq_sgls);
|
||||
* @flags If MSG_DONTWAIT is set, then only report if function would sleep
|
||||
* @return 0 when writable memory is available, < 0 upon error
|
||||
*/
|
||||
int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags)
|
||||
static int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags)
|
||||
{
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
int err = -ERESTARTSYS;
|
||||
@@ -721,7 +720,6 @@ int af_alg_wait_for_wmem(struct sock *sk, unsigned int flags)
|
||||
|
||||
return err;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_wait_for_wmem);
|
||||
|
||||
/**
|
||||
* af_alg_wmem_wakeup - wakeup caller when writable memory is available
|
||||
@@ -751,9 +749,10 @@ EXPORT_SYMBOL_GPL(af_alg_wmem_wakeup);
|
||||
*
|
||||
* @sk socket of connection to user space
|
||||
* @flags If MSG_DONTWAIT is set, then only report if function would sleep
|
||||
* @min Set to minimum request size if partial requests are allowed.
|
||||
* @return 0 when writable memory is available, < 0 upon error
|
||||
*/
|
||||
int af_alg_wait_for_data(struct sock *sk, unsigned flags)
|
||||
int af_alg_wait_for_data(struct sock *sk, unsigned flags, unsigned min)
|
||||
{
|
||||
DEFINE_WAIT_FUNC(wait, woken_wake_function);
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
@@ -771,7 +770,9 @@ int af_alg_wait_for_data(struct sock *sk, unsigned flags)
|
||||
if (signal_pending(current))
|
||||
break;
|
||||
timeout = MAX_SCHEDULE_TIMEOUT;
|
||||
if (sk_wait_event(sk, &timeout, (ctx->used || !ctx->more),
|
||||
if (sk_wait_event(sk, &timeout,
|
||||
ctx->init && (!ctx->more ||
|
||||
(min && ctx->used >= min)),
|
||||
&wait)) {
|
||||
err = 0;
|
||||
break;
|
||||
@@ -790,8 +791,7 @@ EXPORT_SYMBOL_GPL(af_alg_wait_for_data);
|
||||
*
|
||||
* @sk socket of connection to user space
|
||||
*/
|
||||
|
||||
void af_alg_data_wakeup(struct sock *sk)
|
||||
static void af_alg_data_wakeup(struct sock *sk)
|
||||
{
|
||||
struct alg_sock *ask = alg_sk(sk);
|
||||
struct af_alg_ctx *ctx = ask->private;
|
||||
@@ -809,7 +809,6 @@ void af_alg_data_wakeup(struct sock *sk)
|
||||
sk_wake_async(sk, SOCK_WAKE_SPACE, POLL_OUT);
|
||||
rcu_read_unlock();
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(af_alg_data_wakeup);
|
||||
|
||||
/**
|
||||
* af_alg_sendmsg - implementation of sendmsg system call handler
|
||||
@@ -862,10 +861,17 @@ int af_alg_sendmsg(struct socket *sock, struct msghdr *msg, size_t size,
|
||||
}
|
||||
|
||||
lock_sock(sk);
|
||||
if (!ctx->more && ctx->used) {
|
||||
err = -EINVAL;
|
||||
goto unlock;
|
||||
if (ctx->init && !ctx->more) {
|
||||
if (ctx->used) {
|
||||
err = -EINVAL;
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
pr_info_once(
|
||||
"%s sent an empty control message without MSG_MORE.\n",
|
||||
current->comm);
|
||||
}
|
||||
ctx->init = true;
|
||||
|
||||
if (init) {
|
||||
ctx->enc = enc;
|
||||
|
||||
@@ -110,8 +110,8 @@ static int _aead_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
size_t usedpages = 0; /* [in] RX bufs to be used from user */
|
||||
size_t processed = 0; /* [in] TX bufs to be consumed */
|
||||
|
||||
if (!ctx->used) {
|
||||
err = af_alg_wait_for_data(sk, flags);
|
||||
if (!ctx->init || ctx->more) {
|
||||
err = af_alg_wait_for_data(sk, flags, 0);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@@ -563,12 +563,6 @@ static int aead_accept_parent_nokey(void *private, struct sock *sk)
|
||||
|
||||
INIT_LIST_HEAD(&ctx->tsgl_list);
|
||||
ctx->len = len;
|
||||
ctx->used = 0;
|
||||
atomic_set(&ctx->rcvused, 0);
|
||||
ctx->more = 0;
|
||||
ctx->merge = 0;
|
||||
ctx->enc = 0;
|
||||
ctx->aead_assoclen = 0;
|
||||
crypto_init_wait(&ctx->wait);
|
||||
|
||||
ask->private = ctx;
|
||||
|
||||
@@ -65,8 +65,8 @@ static int _skcipher_recvmsg(struct socket *sock, struct msghdr *msg,
|
||||
int err = 0;
|
||||
size_t len = 0;
|
||||
|
||||
if (!ctx->used) {
|
||||
err = af_alg_wait_for_data(sk, flags);
|
||||
if (!ctx->init || (ctx->more && ctx->used < bs)) {
|
||||
err = af_alg_wait_for_data(sk, flags, bs);
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
@@ -337,6 +337,7 @@ static int skcipher_accept_parent_nokey(void *private, struct sock *sk)
|
||||
ctx = sock_kmalloc(sk, len, GFP_KERNEL);
|
||||
if (!ctx)
|
||||
return -ENOMEM;
|
||||
memset(ctx, 0, len);
|
||||
|
||||
ctx->iv = sock_kmalloc(sk, crypto_skcipher_ivsize(tfm),
|
||||
GFP_KERNEL);
|
||||
@@ -344,16 +345,10 @@ static int skcipher_accept_parent_nokey(void *private, struct sock *sk)
|
||||
sock_kfree_s(sk, ctx, len);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(ctx->iv, 0, crypto_skcipher_ivsize(tfm));
|
||||
|
||||
INIT_LIST_HEAD(&ctx->tsgl_list);
|
||||
ctx->len = len;
|
||||
ctx->used = 0;
|
||||
atomic_set(&ctx->rcvused, 0);
|
||||
ctx->more = 0;
|
||||
ctx->merge = 0;
|
||||
ctx->enc = 0;
|
||||
crypto_init_wait(&ctx->wait);
|
||||
|
||||
ask->private = ctx;
|
||||
|
||||
@@ -1530,6 +1530,8 @@ int acpi_processor_power_exit(struct acpi_processor *pr)
|
||||
acpi_processor_registered--;
|
||||
if (acpi_processor_registered == 0)
|
||||
cpuidle_unregister_driver(&acpi_idle_driver);
|
||||
|
||||
kfree(dev);
|
||||
}
|
||||
|
||||
pr->flags.power_setup_done = 0;
|
||||
|
||||
@@ -321,18 +321,14 @@ static int acpi_scan_device_check(struct acpi_device *adev)
|
||||
* again).
|
||||
*/
|
||||
if (adev->handler) {
|
||||
dev_warn(&adev->dev, "Already enumerated\n");
|
||||
return -EALREADY;
|
||||
dev_dbg(&adev->dev, "Already enumerated\n");
|
||||
return 0;
|
||||
}
|
||||
error = acpi_bus_scan(adev->handle);
|
||||
if (error) {
|
||||
dev_warn(&adev->dev, "Namespace scan failure\n");
|
||||
return error;
|
||||
}
|
||||
if (!adev->handler) {
|
||||
dev_warn(&adev->dev, "Enumeration failure\n");
|
||||
error = -ENODEV;
|
||||
}
|
||||
} else {
|
||||
error = acpi_scan_device_not_present(adev);
|
||||
}
|
||||
|
||||
@@ -420,13 +420,16 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff_head *qu
|
||||
rcu_read_lock();
|
||||
for_each_netdev_rcu(&init_net, ifp) {
|
||||
dev_hold(ifp);
|
||||
if (!is_aoe_netif(ifp))
|
||||
goto cont;
|
||||
if (!is_aoe_netif(ifp)) {
|
||||
dev_put(ifp);
|
||||
continue;
|
||||
}
|
||||
|
||||
skb = new_skb(sizeof *h + sizeof *ch);
|
||||
if (skb == NULL) {
|
||||
printk(KERN_INFO "aoe: skb alloc failure\n");
|
||||
goto cont;
|
||||
dev_put(ifp);
|
||||
continue;
|
||||
}
|
||||
skb_put(skb, sizeof *h + sizeof *ch);
|
||||
skb->dev = ifp;
|
||||
@@ -441,9 +444,6 @@ aoecmd_cfg_pkts(ushort aoemajor, unsigned char aoeminor, struct sk_buff_head *qu
|
||||
h->major = cpu_to_be16(aoemajor);
|
||||
h->minor = aoeminor;
|
||||
h->cmd = AOECMD_CFG;
|
||||
|
||||
cont:
|
||||
dev_put(ifp);
|
||||
}
|
||||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ tx(int id) __must_hold(&txlock)
|
||||
pr_warn("aoe: packet could not be sent on %s. %s\n",
|
||||
ifp ? ifp->name : "netif",
|
||||
"consider increasing tx_queue_len");
|
||||
dev_put(ifp);
|
||||
spin_lock_irq(&txlock);
|
||||
}
|
||||
return 0;
|
||||
|
||||
@@ -126,12 +126,13 @@ config SUNXI_RSB
|
||||
|
||||
config TEGRA_ACONNECT
|
||||
tristate "Tegra ACONNECT Bus Driver"
|
||||
depends on ARCH_TEGRA_210_SOC
|
||||
depends on ARCH_TEGRA
|
||||
depends on OF && PM
|
||||
select PM_CLK
|
||||
help
|
||||
Driver for the Tegra ACONNECT bus which is used to interface with
|
||||
the devices inside the Audio Processing Engine (APE) for Tegra210.
|
||||
the devices inside the Audio Processing Engine (APE) for
|
||||
Tegra210 and later.
|
||||
|
||||
config TEGRA_GMI
|
||||
tristate "Tegra Generic Memory Interface bus driver"
|
||||
|
||||
@@ -142,7 +142,7 @@ static void hi3519_clk_unregister(struct platform_device *pdev)
|
||||
of_clk_del_provider(pdev->dev.of_node);
|
||||
|
||||
hisi_clk_unregister_gate(hi3519_gate_clks,
|
||||
ARRAY_SIZE(hi3519_mux_clks),
|
||||
ARRAY_SIZE(hi3519_gate_clks),
|
||||
crg->clk_data);
|
||||
hisi_clk_unregister_mux(hi3519_mux_clks,
|
||||
ARRAY_SIZE(hi3519_mux_clks),
|
||||
|
||||
@@ -569,6 +569,8 @@ static struct clk_branch disp_cc_mdss_vsync_clk = {
|
||||
|
||||
static struct gdsc mdss_gdsc = {
|
||||
.gdscr = 0x3000,
|
||||
.en_few_wait_val = 0x6,
|
||||
.en_rest_wait_val = 0x5,
|
||||
.pd = {
|
||||
.name = "mdss_gdsc",
|
||||
},
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2017-2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2015, 2017-2018, 2022, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -39,9 +39,14 @@
|
||||
#define CFG_GDSCR_OFFSET 0x4
|
||||
|
||||
/* Wait 2^n CXO cycles between all states. Here, n=2 (4 cycles). */
|
||||
#define EN_REST_WAIT_VAL (0x2 << 20)
|
||||
#define EN_FEW_WAIT_VAL (0x8 << 16)
|
||||
#define CLK_DIS_WAIT_VAL (0x2 << 12)
|
||||
#define EN_REST_WAIT_VAL 0x2
|
||||
#define EN_FEW_WAIT_VAL 0x8
|
||||
#define CLK_DIS_WAIT_VAL 0x2
|
||||
|
||||
/* Transition delay shifts */
|
||||
#define EN_REST_WAIT_SHIFT 20
|
||||
#define EN_FEW_WAIT_SHIFT 16
|
||||
#define CLK_DIS_WAIT_SHIFT 12
|
||||
|
||||
#define RETAIN_MEM BIT(14)
|
||||
#define RETAIN_PERIPH BIT(13)
|
||||
@@ -314,7 +319,18 @@ static int gdsc_init(struct gdsc *sc)
|
||||
*/
|
||||
mask = HW_CONTROL_MASK | SW_OVERRIDE_MASK |
|
||||
EN_REST_WAIT_MASK | EN_FEW_WAIT_MASK | CLK_DIS_WAIT_MASK;
|
||||
val = EN_REST_WAIT_VAL | EN_FEW_WAIT_VAL | CLK_DIS_WAIT_VAL;
|
||||
|
||||
if (!sc->en_rest_wait_val)
|
||||
sc->en_rest_wait_val = EN_REST_WAIT_VAL;
|
||||
if (!sc->en_few_wait_val)
|
||||
sc->en_few_wait_val = EN_FEW_WAIT_VAL;
|
||||
if (!sc->clk_dis_wait_val)
|
||||
sc->clk_dis_wait_val = CLK_DIS_WAIT_VAL;
|
||||
|
||||
val = sc->en_rest_wait_val << EN_REST_WAIT_SHIFT |
|
||||
sc->en_few_wait_val << EN_FEW_WAIT_SHIFT |
|
||||
sc->clk_dis_wait_val << CLK_DIS_WAIT_SHIFT;
|
||||
|
||||
ret = regmap_update_bits(sc->regmap, sc->gdscr, mask, val);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2015, 2017-2018, The Linux Foundation. All rights reserved.
|
||||
* Copyright (c) 2015, 2017-2018, 2022, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 and
|
||||
@@ -29,6 +29,9 @@ struct reset_controller_dev;
|
||||
* @cxcs: offsets of branch registers to toggle mem/periph bits in
|
||||
* @cxc_count: number of @cxcs
|
||||
* @pwrsts: Possible powerdomain power states
|
||||
* @en_rest_wait_val: transition delay value for receiving enr ack signal
|
||||
* @en_few_wait_val: transition delay value for receiving enf ack signal
|
||||
* @clk_dis_wait_val: transition delay value for halting clock
|
||||
* @resets: ids of resets associated with this gdsc
|
||||
* @reset_count: number of @resets
|
||||
* @rcdev: reset controller
|
||||
@@ -42,6 +45,9 @@ struct gdsc {
|
||||
unsigned int clamp_io_ctrl;
|
||||
unsigned int *cxcs;
|
||||
unsigned int cxc_count;
|
||||
unsigned int en_rest_wait_val;
|
||||
unsigned int en_few_wait_val;
|
||||
unsigned int clk_dis_wait_val;
|
||||
const u8 pwrsts;
|
||||
/* Powerdomain allowable state bitfields */
|
||||
#define PWRSTS_OFF BIT(0)
|
||||
|
||||
@@ -21,14 +21,16 @@
|
||||
|
||||
static int qcom_reset(struct reset_controller_dev *rcdev, unsigned long id)
|
||||
{
|
||||
struct qcom_reset_controller *rst = to_qcom_reset_controller(rcdev);
|
||||
|
||||
rcdev->ops->assert(rcdev, id);
|
||||
udelay(1);
|
||||
udelay(rst->reset_map[id].udelay ?: 1); /* use 1 us as default */
|
||||
rcdev->ops->deassert(rcdev, id);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
|
||||
static int qcom_reset_set_assert(struct reset_controller_dev *rcdev,
|
||||
unsigned long id, bool assert)
|
||||
{
|
||||
struct qcom_reset_controller *rst;
|
||||
const struct qcom_reset_map *map;
|
||||
@@ -36,23 +38,24 @@ qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
|
||||
|
||||
rst = to_qcom_reset_controller(rcdev);
|
||||
map = &rst->reset_map[id];
|
||||
mask = BIT(map->bit);
|
||||
mask = map->bitmask ? map->bitmask : BIT(map->bit);
|
||||
|
||||
return regmap_update_bits(rst->regmap, map->reg, mask, mask);
|
||||
regmap_update_bits(rst->regmap, map->reg, mask, assert ? mask : 0);
|
||||
|
||||
/* Read back the register to ensure write completion, ignore the value */
|
||||
regmap_read(rst->regmap, map->reg, &mask);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int
|
||||
qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
|
||||
static int qcom_reset_assert(struct reset_controller_dev *rcdev, unsigned long id)
|
||||
{
|
||||
struct qcom_reset_controller *rst;
|
||||
const struct qcom_reset_map *map;
|
||||
u32 mask;
|
||||
return qcom_reset_set_assert(rcdev, id, true);
|
||||
}
|
||||
|
||||
rst = to_qcom_reset_controller(rcdev);
|
||||
map = &rst->reset_map[id];
|
||||
mask = BIT(map->bit);
|
||||
|
||||
return regmap_update_bits(rst->regmap, map->reg, mask, 0);
|
||||
static int qcom_reset_deassert(struct reset_controller_dev *rcdev, unsigned long id)
|
||||
{
|
||||
return qcom_reset_set_assert(rcdev, id, false);
|
||||
}
|
||||
|
||||
const struct reset_control_ops qcom_reset_ops = {
|
||||
|
||||
@@ -19,6 +19,8 @@
|
||||
struct qcom_reset_map {
|
||||
unsigned int reg;
|
||||
u8 bit;
|
||||
u8 udelay;
|
||||
u32 bitmask;
|
||||
};
|
||||
|
||||
struct regmap;
|
||||
|
||||
@@ -513,7 +513,19 @@ static void bm_work(struct work_struct *work)
|
||||
fw_notice(card, "phy config: new root=%x, gap_count=%d\n",
|
||||
new_root_id, gap_count);
|
||||
fw_send_phy_config(card, new_root_id, generation, gap_count);
|
||||
reset_bus(card, true);
|
||||
/*
|
||||
* Where possible, use a short bus reset to minimize
|
||||
* disruption to isochronous transfers. But in the event
|
||||
* of a gap count inconsistency, use a long bus reset.
|
||||
*
|
||||
* As noted in 1394a 8.4.6.2, nodes on a mixed 1394/1394a bus
|
||||
* may set different gap counts after a bus reset. On a mixed
|
||||
* 1394/1394a bus, a short bus reset can get doubled. Some
|
||||
* nodes may treat the double reset as one bus reset and others
|
||||
* may treat it as two, causing a gap count inconsistency
|
||||
* again. Using a long bus reset prevents this.
|
||||
*/
|
||||
reset_bus(card, card->gap_count != 0);
|
||||
/* Will allocate broadcast channel after the reset. */
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -306,7 +306,7 @@ static uint32_t atom_get_src_int(atom_exec_context *ctx, uint8_t attr,
|
||||
DEBUG("IMM 0x%02X\n", val);
|
||||
return val;
|
||||
}
|
||||
return 0;
|
||||
break;
|
||||
case ATOM_ARG_PLL:
|
||||
idx = U8(*ptr);
|
||||
(*ptr)++;
|
||||
|
||||
@@ -79,11 +79,13 @@ static void mtk_drm_crtc_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
|
||||
struct drm_crtc *crtc = &mtk_crtc->base;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&crtc->dev->event_lock, flags);
|
||||
drm_crtc_send_vblank_event(crtc, mtk_crtc->event);
|
||||
drm_crtc_vblank_put(crtc);
|
||||
mtk_crtc->event = NULL;
|
||||
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
||||
if (mtk_crtc->event) {
|
||||
spin_lock_irqsave(&crtc->dev->event_lock, flags);
|
||||
drm_crtc_send_vblank_event(crtc, mtk_crtc->event);
|
||||
drm_crtc_vblank_put(crtc);
|
||||
mtk_crtc->event = NULL;
|
||||
spin_unlock_irqrestore(&crtc->dev->event_lock, flags);
|
||||
}
|
||||
}
|
||||
|
||||
static void mtk_drm_finish_page_flip(struct mtk_drm_crtc *mtk_crtc)
|
||||
|
||||
@@ -70,8 +70,8 @@
|
||||
#define DSI_PS_WC 0x3fff
|
||||
#define DSI_PS_SEL (3 << 16)
|
||||
#define PACKED_PS_16BIT_RGB565 (0 << 16)
|
||||
#define LOOSELY_PS_18BIT_RGB666 (1 << 16)
|
||||
#define PACKED_PS_18BIT_RGB666 (2 << 16)
|
||||
#define PACKED_PS_18BIT_RGB666 (1 << 16)
|
||||
#define LOOSELY_PS_24BIT_RGB666 (2 << 16)
|
||||
#define PACKED_PS_24BIT_RGB888 (3 << 16)
|
||||
|
||||
#define DSI_VSA_NL 0x20
|
||||
@@ -327,10 +327,10 @@ static void mtk_dsi_ps_control_vact(struct mtk_dsi *dsi)
|
||||
ps_bpp_mode |= PACKED_PS_24BIT_RGB888;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB666:
|
||||
ps_bpp_mode |= PACKED_PS_18BIT_RGB666;
|
||||
ps_bpp_mode |= LOOSELY_PS_24BIT_RGB666;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB666_PACKED:
|
||||
ps_bpp_mode |= LOOSELY_PS_18BIT_RGB666;
|
||||
ps_bpp_mode |= PACKED_PS_18BIT_RGB666;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB565:
|
||||
ps_bpp_mode |= PACKED_PS_16BIT_RGB565;
|
||||
@@ -381,7 +381,7 @@ static void mtk_dsi_ps_control(struct mtk_dsi *dsi)
|
||||
dsi_tmp_buf_bpp = 3;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB666:
|
||||
tmp_reg = LOOSELY_PS_18BIT_RGB666;
|
||||
tmp_reg = LOOSELY_PS_24BIT_RGB666;
|
||||
dsi_tmp_buf_bpp = 3;
|
||||
break;
|
||||
case MIPI_DSI_FMT_RGB666_PACKED:
|
||||
|
||||
@@ -823,7 +823,7 @@ int ni_init_microcode(struct radeon_device *rdev)
|
||||
err = 0;
|
||||
} else if (rdev->smc_fw->size != smc_req_size) {
|
||||
pr_err("ni_mc: Bogus length %zu in firmware \"%s\"\n",
|
||||
rdev->mc_fw->size, fw_name);
|
||||
rdev->smc_fw->size, fw_name);
|
||||
err = -EINVAL;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -408,7 +408,7 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi,
|
||||
hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HBLANK_L, value & 0xFF);
|
||||
hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HBLANK_H, (value >> 8) & 0xFF);
|
||||
|
||||
value = mode->hsync_start - mode->hdisplay;
|
||||
value = mode->htotal - mode->hsync_start;
|
||||
hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDELAY_L, value & 0xFF);
|
||||
hdmi_writeb(hdmi, HDMI_VIDEO_EXT_HDELAY_H, (value >> 8) & 0xFF);
|
||||
|
||||
@@ -423,7 +423,7 @@ static int inno_hdmi_config_video_timing(struct inno_hdmi *hdmi,
|
||||
value = mode->vtotal - mode->vdisplay;
|
||||
hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VBLANK, value & 0xFF);
|
||||
|
||||
value = mode->vsync_start - mode->vdisplay;
|
||||
value = mode->vtotal - mode->vsync_start;
|
||||
hdmi_writeb(hdmi, HDMI_VIDEO_EXT_VDELAY, value & 0xFF);
|
||||
|
||||
value = mode->vsync_end - mode->vsync_start;
|
||||
|
||||
@@ -373,8 +373,7 @@ static int rockchip_lvds_bind(struct device *dev, struct device *master,
|
||||
ret = -EINVAL;
|
||||
goto err_put_port;
|
||||
} else if (ret) {
|
||||
DRM_DEV_ERROR(dev, "failed to find panel and bridge node\n");
|
||||
ret = -EPROBE_DEFER;
|
||||
dev_err_probe(dev, ret, "failed to find panel and bridge node\n");
|
||||
goto err_put_port;
|
||||
}
|
||||
if (lvds->panel)
|
||||
|
||||
@@ -1452,9 +1452,11 @@ static int tegra_dsi_ganged_probe(struct tegra_dsi *dsi)
|
||||
np = of_parse_phandle(dsi->dev->of_node, "nvidia,ganged-mode", 0);
|
||||
if (np) {
|
||||
struct platform_device *gangster = of_find_device_by_node(np);
|
||||
of_node_put(np);
|
||||
if (!gangster)
|
||||
return -EPROBE_DEFER;
|
||||
|
||||
dsi->slave = platform_get_drvdata(gangster);
|
||||
of_node_put(np);
|
||||
|
||||
if (!dsi->slave) {
|
||||
put_device(&gangster->dev);
|
||||
@@ -1502,48 +1504,58 @@ static int tegra_dsi_probe(struct platform_device *pdev)
|
||||
|
||||
if (!pdev->dev.pm_domain) {
|
||||
dsi->rst = devm_reset_control_get(&pdev->dev, "dsi");
|
||||
if (IS_ERR(dsi->rst))
|
||||
return PTR_ERR(dsi->rst);
|
||||
if (IS_ERR(dsi->rst)) {
|
||||
err = PTR_ERR(dsi->rst);
|
||||
goto remove;
|
||||
}
|
||||
}
|
||||
|
||||
dsi->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(dsi->clk)) {
|
||||
dev_err(&pdev->dev, "cannot get DSI clock\n");
|
||||
return PTR_ERR(dsi->clk);
|
||||
err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk),
|
||||
"cannot get DSI clock\n");
|
||||
goto remove;
|
||||
}
|
||||
|
||||
dsi->clk_lp = devm_clk_get(&pdev->dev, "lp");
|
||||
if (IS_ERR(dsi->clk_lp)) {
|
||||
dev_err(&pdev->dev, "cannot get low-power clock\n");
|
||||
return PTR_ERR(dsi->clk_lp);
|
||||
err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_lp),
|
||||
"cannot get low-power clock\n");
|
||||
goto remove;
|
||||
}
|
||||
|
||||
dsi->clk_parent = devm_clk_get(&pdev->dev, "parent");
|
||||
if (IS_ERR(dsi->clk_parent)) {
|
||||
dev_err(&pdev->dev, "cannot get parent clock\n");
|
||||
return PTR_ERR(dsi->clk_parent);
|
||||
err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->clk_parent),
|
||||
"cannot get parent clock\n");
|
||||
goto remove;
|
||||
}
|
||||
|
||||
dsi->vdd = devm_regulator_get(&pdev->dev, "avdd-dsi-csi");
|
||||
if (IS_ERR(dsi->vdd)) {
|
||||
dev_err(&pdev->dev, "cannot get VDD supply\n");
|
||||
return PTR_ERR(dsi->vdd);
|
||||
err = dev_err_probe(&pdev->dev, PTR_ERR(dsi->vdd),
|
||||
"cannot get VDD supply\n");
|
||||
goto remove;
|
||||
}
|
||||
|
||||
err = tegra_dsi_setup_clocks(dsi);
|
||||
if (err < 0) {
|
||||
dev_err(&pdev->dev, "cannot setup clocks\n");
|
||||
return err;
|
||||
goto remove;
|
||||
}
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
dsi->regs = devm_ioremap_resource(&pdev->dev, regs);
|
||||
if (IS_ERR(dsi->regs))
|
||||
return PTR_ERR(dsi->regs);
|
||||
if (IS_ERR(dsi->regs)) {
|
||||
err = PTR_ERR(dsi->regs);
|
||||
goto remove;
|
||||
}
|
||||
|
||||
dsi->mipi = tegra_mipi_request(&pdev->dev);
|
||||
if (IS_ERR(dsi->mipi))
|
||||
return PTR_ERR(dsi->mipi);
|
||||
dsi->mipi = tegra_mipi_request(&pdev->dev, pdev->dev.of_node);
|
||||
if (IS_ERR(dsi->mipi)) {
|
||||
err = PTR_ERR(dsi->mipi);
|
||||
goto remove;
|
||||
}
|
||||
|
||||
dsi->host.ops = &tegra_dsi_host_ops;
|
||||
dsi->host.dev = &pdev->dev;
|
||||
@@ -1571,9 +1583,12 @@ static int tegra_dsi_probe(struct platform_device *pdev)
|
||||
return 0;
|
||||
|
||||
unregister:
|
||||
pm_runtime_disable(&pdev->dev);
|
||||
mipi_dsi_host_unregister(&dsi->host);
|
||||
mipi_free:
|
||||
tegra_mipi_free(dsi->mipi);
|
||||
remove:
|
||||
tegra_output_remove(&dsi->output);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
@@ -157,6 +157,7 @@ struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
|
||||
|
||||
if (gem->size < size) {
|
||||
err = -EINVAL;
|
||||
drm_gem_object_put(gem);
|
||||
goto unreference;
|
||||
}
|
||||
|
||||
|
||||
@@ -206,9 +206,9 @@ static int tegra_mipi_power_down(struct tegra_mipi *mipi)
|
||||
return 0;
|
||||
}
|
||||
|
||||
struct tegra_mipi_device *tegra_mipi_request(struct device *device)
|
||||
struct tegra_mipi_device *tegra_mipi_request(struct device *device,
|
||||
struct device_node *np)
|
||||
{
|
||||
struct device_node *np = device->of_node;
|
||||
struct tegra_mipi_device *dev;
|
||||
struct of_phandle_args args;
|
||||
int err;
|
||||
|
||||
@@ -328,12 +328,10 @@ static int gpio_keys_polled_probe(struct platform_device *pdev)
|
||||
|
||||
error = devm_gpio_request_one(dev, button->gpio,
|
||||
flags, button->desc ? : DRV_NAME);
|
||||
if (error) {
|
||||
dev_err(dev,
|
||||
"unable to claim gpio %u, err=%d\n",
|
||||
button->gpio, error);
|
||||
return error;
|
||||
}
|
||||
if (error)
|
||||
return dev_err_probe(dev, error,
|
||||
"unable to claim gpio %u\n",
|
||||
button->gpio);
|
||||
|
||||
bdata->gpiod = gpio_to_desc(button->gpio);
|
||||
if (!bdata->gpiod) {
|
||||
|
||||
@@ -1733,6 +1733,9 @@ static int __init iommu_init_pci(struct amd_iommu *iommu)
|
||||
/* Prevent binding other PCI device drivers to IOMMU devices */
|
||||
iommu->dev->match_driver = false;
|
||||
|
||||
/* ACPI _PRT won't have an IRQ for IOMMU */
|
||||
iommu->dev->irq_managed = 1;
|
||||
|
||||
pci_read_config_dword(iommu->dev, cap_ptr + MMIO_CAP_HDR_OFFSET,
|
||||
&iommu->cap);
|
||||
pci_read_config_dword(iommu->dev, cap_ptr + MMIO_RANGE_OFFSET,
|
||||
|
||||
@@ -46,11 +46,11 @@
|
||||
struct convert_context {
|
||||
struct completion restart;
|
||||
struct bio *bio_in;
|
||||
struct bio *bio_out;
|
||||
struct bvec_iter iter_in;
|
||||
struct bio *bio_out;
|
||||
struct bvec_iter iter_out;
|
||||
u64 cc_sector;
|
||||
atomic_t cc_pending;
|
||||
u64 cc_sector;
|
||||
union {
|
||||
struct skcipher_request *req;
|
||||
struct aead_request *req_aead;
|
||||
|
||||
@@ -3348,14 +3348,14 @@ static int raid_map(struct dm_target *ti, struct bio *bio)
|
||||
struct mddev *mddev = &rs->md;
|
||||
|
||||
/*
|
||||
* If we're reshaping to add disk(s)), ti->len and
|
||||
* If we're reshaping to add disk(s), ti->len and
|
||||
* mddev->array_sectors will differ during the process
|
||||
* (ti->len > mddev->array_sectors), so we have to requeue
|
||||
* bios with addresses > mddev->array_sectors here or
|
||||
* there will occur accesses past EOD of the component
|
||||
* data images thus erroring the raid set.
|
||||
*/
|
||||
if (unlikely(bio_end_sector(bio) > mddev->array_sectors))
|
||||
if (unlikely(bio_has_data(bio) && bio_end_sector(bio) > mddev->array_sectors))
|
||||
return DM_MAPIO_REQUEUE;
|
||||
|
||||
md_handle_request(mddev, bio);
|
||||
|
||||
@@ -72,11 +72,11 @@ struct dm_verity_io {
|
||||
/* original value of bio->bi_end_io */
|
||||
bio_end_io_t *orig_bi_end_io;
|
||||
|
||||
struct bvec_iter iter;
|
||||
|
||||
sector_t block;
|
||||
unsigned n_blocks;
|
||||
|
||||
struct bvec_iter iter;
|
||||
|
||||
struct work_struct work;
|
||||
|
||||
/*
|
||||
|
||||
@@ -2966,6 +2966,9 @@ static void __dm_internal_suspend(struct mapped_device *md, unsigned suspend_fla
|
||||
|
||||
static void __dm_internal_resume(struct mapped_device *md)
|
||||
{
|
||||
int r;
|
||||
struct dm_table *map;
|
||||
|
||||
BUG_ON(!md->internal_suspend_count);
|
||||
|
||||
if (--md->internal_suspend_count)
|
||||
@@ -2974,12 +2977,23 @@ static void __dm_internal_resume(struct mapped_device *md)
|
||||
if (dm_suspended_md(md))
|
||||
goto done; /* resume from nested suspend */
|
||||
|
||||
/*
|
||||
* NOTE: existing callers don't need to call dm_table_resume_targets
|
||||
* (which may fail -- so best to avoid it for now by passing NULL map)
|
||||
*/
|
||||
(void) __dm_resume(md, NULL);
|
||||
|
||||
map = rcu_dereference_protected(md->map, lockdep_is_held(&md->suspend_lock));
|
||||
r = __dm_resume(md, map);
|
||||
if (r) {
|
||||
/*
|
||||
* If a preresume method of some target failed, we are in a
|
||||
* tricky situation. We can't return an error to the caller. We
|
||||
* can't fake success because then the "resume" and
|
||||
* "postsuspend" methods would not be paired correctly, and it
|
||||
* would break various targets, for example it would cause list
|
||||
* corruption in the "origin" target.
|
||||
*
|
||||
* So, we fake normal suspend here, to make sure that the
|
||||
* "resume" and "postsuspend" methods will be paired correctly.
|
||||
*/
|
||||
DMERR("Preresume method failed: %d", r);
|
||||
set_bit(DMF_SUSPENDED, &md->flags);
|
||||
}
|
||||
done:
|
||||
clear_bit(DMF_SUSPENDED_INTERNALLY, &md->flags);
|
||||
smp_mb__after_atomic();
|
||||
|
||||
@@ -5455,6 +5455,7 @@ static int md_alloc(dev_t dev, char *name)
|
||||
* remove it now.
|
||||
*/
|
||||
disk->flags |= GENHD_FL_EXT_DEVT;
|
||||
disk->events |= DISK_EVENT_MEDIA_CHANGE;
|
||||
mddev->gendisk = disk;
|
||||
add_disk(disk);
|
||||
|
||||
@@ -5885,7 +5886,15 @@ static void md_clean(struct mddev *mddev)
|
||||
mddev->persistent = 0;
|
||||
mddev->level = LEVEL_NONE;
|
||||
mddev->clevel[0] = 0;
|
||||
mddev->flags = 0;
|
||||
/*
|
||||
* Don't clear MD_CLOSING, or mddev can be opened again.
|
||||
* 'hold_active != 0' means mddev is still in the creation
|
||||
* process and will be used later.
|
||||
*/
|
||||
if (mddev->hold_active)
|
||||
mddev->flags = 0;
|
||||
else
|
||||
mddev->flags &= BIT_ULL_MASK(MD_CLOSING);
|
||||
mddev->sb_flags = 0;
|
||||
mddev->ro = 0;
|
||||
mddev->metadata_type[0] = 0;
|
||||
@@ -7171,7 +7180,6 @@ static inline bool md_ioctl_valid(unsigned int cmd)
|
||||
{
|
||||
switch (cmd) {
|
||||
case ADD_NEW_DISK:
|
||||
case BLKROSET:
|
||||
case GET_ARRAY_INFO:
|
||||
case GET_BITMAP_FILE:
|
||||
case GET_DISK_INFO:
|
||||
@@ -7199,8 +7207,6 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
int err = 0;
|
||||
void __user *argp = (void __user *)arg;
|
||||
struct mddev *mddev = NULL;
|
||||
int ro;
|
||||
bool did_set_md_closing = false;
|
||||
|
||||
if (!md_ioctl_valid(cmd))
|
||||
return -ENOTTY;
|
||||
@@ -7295,7 +7301,6 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
err = -EBUSY;
|
||||
goto out;
|
||||
}
|
||||
did_set_md_closing = true;
|
||||
mutex_unlock(&mddev->open_mutex);
|
||||
sync_blockdev(bdev);
|
||||
}
|
||||
@@ -7390,35 +7395,6 @@ static int md_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
goto unlock;
|
||||
}
|
||||
break;
|
||||
|
||||
case BLKROSET:
|
||||
if (get_user(ro, (int __user *)(arg))) {
|
||||
err = -EFAULT;
|
||||
goto unlock;
|
||||
}
|
||||
err = -EINVAL;
|
||||
|
||||
/* if the bdev is going readonly the value of mddev->ro
|
||||
* does not matter, no writes are coming
|
||||
*/
|
||||
if (ro)
|
||||
goto unlock;
|
||||
|
||||
/* are we are already prepared for writes? */
|
||||
if (mddev->ro != 1)
|
||||
goto unlock;
|
||||
|
||||
/* transitioning to readauto need only happen for
|
||||
* arrays that call md_write_start
|
||||
*/
|
||||
if (mddev->pers) {
|
||||
err = restart_array(mddev);
|
||||
if (err == 0) {
|
||||
mddev->ro = 2;
|
||||
set_disk_ro(mddev->gendisk, 0);
|
||||
}
|
||||
}
|
||||
goto unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -7488,7 +7464,7 @@ unlock:
|
||||
mddev->hold_active = 0;
|
||||
mddev_unlock(mddev);
|
||||
out:
|
||||
if(did_set_md_closing)
|
||||
if (cmd == STOP_ARRAY_RO || (err && cmd == STOP_ARRAY))
|
||||
clear_bit(MD_CLOSING, &mddev->flags);
|
||||
return err;
|
||||
}
|
||||
@@ -7512,6 +7488,36 @@ static int md_compat_ioctl(struct block_device *bdev, fmode_t mode,
|
||||
}
|
||||
#endif /* CONFIG_COMPAT */
|
||||
|
||||
static int md_set_read_only(struct block_device *bdev, bool ro)
|
||||
{
|
||||
struct mddev *mddev = bdev->bd_disk->private_data;
|
||||
int err;
|
||||
|
||||
err = mddev_lock(mddev);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
if (!mddev->raid_disks && !mddev->external) {
|
||||
err = -ENODEV;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
/*
|
||||
* Transitioning to read-auto need only happen for arrays that call
|
||||
* md_write_start and which are not ready for writes yet.
|
||||
*/
|
||||
if (!ro && mddev->ro == 1 && mddev->pers) {
|
||||
err = restart_array(mddev);
|
||||
if (err)
|
||||
goto out_unlock;
|
||||
mddev->ro = 2;
|
||||
}
|
||||
|
||||
out_unlock:
|
||||
mddev_unlock(mddev);
|
||||
return err;
|
||||
}
|
||||
|
||||
static int md_open(struct block_device *bdev, fmode_t mode)
|
||||
{
|
||||
/*
|
||||
@@ -7565,20 +7571,17 @@ static void md_release(struct gendisk *disk, fmode_t mode)
|
||||
mddev_put(mddev);
|
||||
}
|
||||
|
||||
static int md_media_changed(struct gendisk *disk)
|
||||
{
|
||||
struct mddev *mddev = disk->private_data;
|
||||
|
||||
return mddev->changed;
|
||||
}
|
||||
|
||||
static int md_revalidate(struct gendisk *disk)
|
||||
static unsigned int md_check_events(struct gendisk *disk, unsigned int clearing)
|
||||
{
|
||||
struct mddev *mddev = disk->private_data;
|
||||
unsigned int ret = 0;
|
||||
|
||||
if (mddev->changed)
|
||||
ret = DISK_EVENT_MEDIA_CHANGE;
|
||||
mddev->changed = 0;
|
||||
return 0;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static const struct block_device_operations md_fops =
|
||||
{
|
||||
.owner = THIS_MODULE,
|
||||
@@ -7589,8 +7592,8 @@ static const struct block_device_operations md_fops =
|
||||
.compat_ioctl = md_compat_ioctl,
|
||||
#endif
|
||||
.getgeo = md_getgeo,
|
||||
.media_changed = md_media_changed,
|
||||
.revalidate_disk= md_revalidate,
|
||||
.check_events = md_check_events,
|
||||
.set_read_only = md_set_read_only,
|
||||
};
|
||||
|
||||
static int md_thread(void *arg)
|
||||
|
||||
@@ -113,6 +113,7 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
|
||||
{
|
||||
unsigned pat;
|
||||
unsigned plane;
|
||||
int ret = 0;
|
||||
|
||||
tpg->max_line_width = max_w;
|
||||
for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++) {
|
||||
@@ -121,14 +122,18 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
|
||||
|
||||
tpg->lines[pat][plane] =
|
||||
vzalloc(array3_size(max_w, 2, pixelsz));
|
||||
if (!tpg->lines[pat][plane])
|
||||
return -ENOMEM;
|
||||
if (!tpg->lines[pat][plane]) {
|
||||
ret = -ENOMEM;
|
||||
goto free_lines;
|
||||
}
|
||||
if (plane == 0)
|
||||
continue;
|
||||
tpg->downsampled_lines[pat][plane] =
|
||||
vzalloc(array3_size(max_w, 2, pixelsz));
|
||||
if (!tpg->downsampled_lines[pat][plane])
|
||||
return -ENOMEM;
|
||||
if (!tpg->downsampled_lines[pat][plane]) {
|
||||
ret = -ENOMEM;
|
||||
goto free_lines;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
|
||||
@@ -136,18 +141,45 @@ int tpg_alloc(struct tpg_data *tpg, unsigned max_w)
|
||||
|
||||
tpg->contrast_line[plane] =
|
||||
vzalloc(array_size(pixelsz, max_w));
|
||||
if (!tpg->contrast_line[plane])
|
||||
return -ENOMEM;
|
||||
if (!tpg->contrast_line[plane]) {
|
||||
ret = -ENOMEM;
|
||||
goto free_contrast_line;
|
||||
}
|
||||
tpg->black_line[plane] =
|
||||
vzalloc(array_size(pixelsz, max_w));
|
||||
if (!tpg->black_line[plane])
|
||||
return -ENOMEM;
|
||||
if (!tpg->black_line[plane]) {
|
||||
ret = -ENOMEM;
|
||||
goto free_contrast_line;
|
||||
}
|
||||
tpg->random_line[plane] =
|
||||
vzalloc(array3_size(max_w, 2, pixelsz));
|
||||
if (!tpg->random_line[plane])
|
||||
return -ENOMEM;
|
||||
if (!tpg->random_line[plane]) {
|
||||
ret = -ENOMEM;
|
||||
goto free_contrast_line;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
|
||||
free_contrast_line:
|
||||
for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
|
||||
vfree(tpg->contrast_line[plane]);
|
||||
vfree(tpg->black_line[plane]);
|
||||
vfree(tpg->random_line[plane]);
|
||||
tpg->contrast_line[plane] = NULL;
|
||||
tpg->black_line[plane] = NULL;
|
||||
tpg->random_line[plane] = NULL;
|
||||
}
|
||||
free_lines:
|
||||
for (pat = 0; pat < TPG_MAX_PAT_LINES; pat++)
|
||||
for (plane = 0; plane < TPG_MAX_PLANES; plane++) {
|
||||
vfree(tpg->lines[pat][plane]);
|
||||
tpg->lines[pat][plane] = NULL;
|
||||
if (plane == 0)
|
||||
continue;
|
||||
vfree(tpg->downsampled_lines[pat][plane]);
|
||||
tpg->downsampled_lines[pat][plane] = NULL;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(tpg_alloc);
|
||||
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
#include <media/tuner.h>
|
||||
|
||||
static DEFINE_MUTEX(dvbdev_mutex);
|
||||
static LIST_HEAD(dvbdevfops_list);
|
||||
static int dvbdev_debug;
|
||||
|
||||
module_param(dvbdev_debug, int, 0644);
|
||||
@@ -464,14 +465,15 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
enum dvb_device_type type, int demux_sink_pads)
|
||||
{
|
||||
struct dvb_device *dvbdev;
|
||||
struct file_operations *dvbdevfops;
|
||||
struct file_operations *dvbdevfops = NULL;
|
||||
struct dvbdevfops_node *node = NULL, *new_node = NULL;
|
||||
struct device *clsdev;
|
||||
int minor;
|
||||
int id, ret;
|
||||
|
||||
mutex_lock(&dvbdev_register_lock);
|
||||
|
||||
if ((id = dvbdev_get_free_id (adap, type)) < 0){
|
||||
if ((id = dvbdev_get_free_id (adap, type)) < 0) {
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
*pdvbdev = NULL;
|
||||
pr_err("%s: couldn't find free device id\n", __func__);
|
||||
@@ -479,18 +481,47 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
}
|
||||
|
||||
*pdvbdev = dvbdev = kzalloc(sizeof(*dvbdev), GFP_KERNEL);
|
||||
|
||||
if (!dvbdev){
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
dvbdevfops = kzalloc(sizeof(struct file_operations), GFP_KERNEL);
|
||||
/*
|
||||
* When a device of the same type is probe()d more than once,
|
||||
* the first allocated fops are used. This prevents memory leaks
|
||||
* that can occur when the same device is probe()d repeatedly.
|
||||
*/
|
||||
list_for_each_entry(node, &dvbdevfops_list, list_head) {
|
||||
if (node->fops->owner == adap->module &&
|
||||
node->type == type &&
|
||||
node->template == template) {
|
||||
dvbdevfops = node->fops;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (!dvbdevfops){
|
||||
kfree (dvbdev);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -ENOMEM;
|
||||
if (dvbdevfops == NULL) {
|
||||
dvbdevfops = kmemdup(template->fops, sizeof(*dvbdevfops), GFP_KERNEL);
|
||||
if (!dvbdevfops) {
|
||||
kfree(dvbdev);
|
||||
*pdvbdev = NULL;
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
new_node = kzalloc(sizeof(struct dvbdevfops_node), GFP_KERNEL);
|
||||
if (!new_node) {
|
||||
kfree(dvbdevfops);
|
||||
kfree(dvbdev);
|
||||
*pdvbdev = NULL;
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
new_node->fops = dvbdevfops;
|
||||
new_node->type = type;
|
||||
new_node->template = template;
|
||||
list_add_tail (&new_node->list_head, &dvbdevfops_list);
|
||||
}
|
||||
|
||||
memcpy(dvbdev, template, sizeof(struct dvb_device));
|
||||
@@ -501,21 +532,22 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
dvbdev->priv = priv;
|
||||
dvbdev->fops = dvbdevfops;
|
||||
init_waitqueue_head (&dvbdev->wait_queue);
|
||||
|
||||
memcpy(dvbdevfops, template->fops, sizeof(struct file_operations));
|
||||
dvbdevfops->owner = adap->module;
|
||||
|
||||
list_add_tail (&dvbdev->list_head, &adap->device_list);
|
||||
|
||||
down_write(&minor_rwsem);
|
||||
#ifdef CONFIG_DVB_DYNAMIC_MINORS
|
||||
for (minor = 0; minor < MAX_DVB_MINORS; minor++)
|
||||
if (dvb_minors[minor] == NULL)
|
||||
break;
|
||||
|
||||
if (minor == MAX_DVB_MINORS) {
|
||||
kfree(dvbdevfops);
|
||||
if (new_node) {
|
||||
list_del (&new_node->list_head);
|
||||
kfree(dvbdevfops);
|
||||
kfree(new_node);
|
||||
}
|
||||
list_del (&dvbdev->list_head);
|
||||
kfree(dvbdev);
|
||||
*pdvbdev = NULL;
|
||||
up_write(&minor_rwsem);
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return -EINVAL;
|
||||
@@ -523,37 +555,49 @@ int dvb_register_device(struct dvb_adapter *adap, struct dvb_device **pdvbdev,
|
||||
#else
|
||||
minor = nums2minor(adap->num, type, id);
|
||||
#endif
|
||||
|
||||
dvbdev->minor = minor;
|
||||
dvb_minors[minor] = dvb_device_get(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
|
||||
ret = dvb_register_media_device(dvbdev, type, minor, demux_sink_pads);
|
||||
if (ret) {
|
||||
pr_err("%s: dvb_register_media_device failed to create the mediagraph\n",
|
||||
__func__);
|
||||
|
||||
if (new_node) {
|
||||
list_del (&new_node->list_head);
|
||||
kfree(dvbdevfops);
|
||||
kfree(new_node);
|
||||
}
|
||||
dvb_media_device_free(dvbdev);
|
||||
kfree(dvbdevfops);
|
||||
list_del (&dvbdev->list_head);
|
||||
kfree(dvbdev);
|
||||
up_write(&minor_rwsem);
|
||||
*pdvbdev = NULL;
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return ret;
|
||||
}
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
|
||||
clsdev = device_create(dvb_class, adap->device,
|
||||
MKDEV(DVB_MAJOR, minor),
|
||||
dvbdev, "dvb%d.%s%d", adap->num, dnames[type], id);
|
||||
if (IS_ERR(clsdev)) {
|
||||
pr_err("%s: failed to create device dvb%d.%s%d (%ld)\n",
|
||||
__func__, adap->num, dnames[type], id, PTR_ERR(clsdev));
|
||||
if (new_node) {
|
||||
list_del (&new_node->list_head);
|
||||
kfree(dvbdevfops);
|
||||
kfree(new_node);
|
||||
}
|
||||
dvb_media_device_free(dvbdev);
|
||||
list_del (&dvbdev->list_head);
|
||||
kfree(dvbdev);
|
||||
*pdvbdev = NULL;
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return PTR_ERR(clsdev);
|
||||
}
|
||||
|
||||
dprintk("DVB: register adapter%d/%s%d @ minor: %i (0x%02x)\n",
|
||||
adap->num, dnames[type], id, minor, minor);
|
||||
|
||||
mutex_unlock(&dvbdev_register_lock);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(dvb_register_device);
|
||||
@@ -582,7 +626,6 @@ static void dvb_free_device(struct kref *ref)
|
||||
{
|
||||
struct dvb_device *dvbdev = container_of(ref, struct dvb_device, ref);
|
||||
|
||||
kfree (dvbdev->fops);
|
||||
kfree (dvbdev);
|
||||
}
|
||||
|
||||
@@ -1078,9 +1121,17 @@ error:
|
||||
|
||||
static void __exit exit_dvbdev(void)
|
||||
{
|
||||
struct dvbdevfops_node *node, *next;
|
||||
|
||||
class_destroy(dvb_class);
|
||||
cdev_del(&dvb_device_cdev);
|
||||
unregister_chrdev_region(MKDEV(DVB_MAJOR, 0), MAX_DVB_MINORS);
|
||||
|
||||
list_for_each_entry_safe(node, next, &dvbdevfops_list, list_head) {
|
||||
list_del (&node->list_head);
|
||||
kfree(node->fops);
|
||||
kfree(node);
|
||||
}
|
||||
}
|
||||
|
||||
subsys_initcall(init_dvbdev);
|
||||
|
||||
@@ -12287,7 +12287,8 @@ struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
|
||||
if (state == NULL)
|
||||
goto error;
|
||||
|
||||
demod = kmalloc(sizeof(struct drx_demod_instance), GFP_KERNEL);
|
||||
demod = kmemdup(&drxj_default_demod_g,
|
||||
sizeof(struct drx_demod_instance), GFP_KERNEL);
|
||||
if (demod == NULL)
|
||||
goto error;
|
||||
|
||||
@@ -12311,8 +12312,6 @@ struct dvb_frontend *drx39xxj_attach(struct i2c_adapter *i2c)
|
||||
state->demod = demod;
|
||||
|
||||
/* setup the demod data */
|
||||
memcpy(demod, &drxj_default_demod_g, sizeof(struct drx_demod_instance));
|
||||
|
||||
demod->my_i2c_dev_addr = demod_addr;
|
||||
demod->my_common_attr = demod_comm_attr;
|
||||
demod->my_i2c_dev_addr->user_data = state;
|
||||
|
||||
@@ -128,50 +128,32 @@ static const s32 stv0367cab_RF_LookUp2[RF_LOOKUP_TABLE2_SIZE][RF_LOOKUP_TABLE2_S
|
||||
}
|
||||
};
|
||||
|
||||
static
|
||||
int stv0367_writeregs(struct stv0367_state *state, u16 reg, u8 *data, int len)
|
||||
static noinline_for_stack
|
||||
int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data)
|
||||
{
|
||||
u8 buf[MAX_XFER_SIZE];
|
||||
u8 buf[3] = { MSB(reg), LSB(reg), data };
|
||||
struct i2c_msg msg = {
|
||||
.addr = state->config->demod_address,
|
||||
.flags = 0,
|
||||
.buf = buf,
|
||||
.len = len + 2
|
||||
.len = 3,
|
||||
};
|
||||
int ret;
|
||||
|
||||
if (2 + len > sizeof(buf)) {
|
||||
printk(KERN_WARNING
|
||||
"%s: i2c wr reg=%04x: len=%d is too big!\n",
|
||||
KBUILD_MODNAME, reg, len);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
|
||||
buf[0] = MSB(reg);
|
||||
buf[1] = LSB(reg);
|
||||
memcpy(buf + 2, data, len);
|
||||
|
||||
if (i2cdebug)
|
||||
printk(KERN_DEBUG "%s: [%02x] %02x: %02x\n", __func__,
|
||||
state->config->demod_address, reg, buf[2]);
|
||||
state->config->demod_address, reg, data);
|
||||
|
||||
ret = i2c_transfer(state->i2c, &msg, 1);
|
||||
if (ret != 1)
|
||||
printk(KERN_ERR "%s: i2c write error! ([%02x] %02x: %02x)\n",
|
||||
__func__, state->config->demod_address, reg, buf[2]);
|
||||
__func__, state->config->demod_address, reg, data);
|
||||
|
||||
return (ret != 1) ? -EREMOTEIO : 0;
|
||||
}
|
||||
|
||||
static int stv0367_writereg(struct stv0367_state *state, u16 reg, u8 data)
|
||||
{
|
||||
u8 tmp = data; /* see gcc.gnu.org/bugzilla/show_bug.cgi?id=81715 */
|
||||
|
||||
return stv0367_writeregs(state, reg, &tmp, 1);
|
||||
}
|
||||
|
||||
static u8 stv0367_readreg(struct stv0367_state *state, u16 reg)
|
||||
static noinline_for_stack
|
||||
u8 stv0367_readreg(struct stv0367_state *state, u16 reg)
|
||||
{
|
||||
u8 b0[] = { 0, 0 };
|
||||
u8 b1[] = { 0 };
|
||||
|
||||
@@ -2107,9 +2107,6 @@ static int tc358743_probe(struct i2c_client *client,
|
||||
state->mbus_fmt_code = MEDIA_BUS_FMT_RGB888_1X24;
|
||||
|
||||
sd->dev = &client->dev;
|
||||
err = v4l2_async_register_subdev(sd);
|
||||
if (err < 0)
|
||||
goto err_hdl;
|
||||
|
||||
mutex_init(&state->confctl_mutex);
|
||||
|
||||
@@ -2167,6 +2164,10 @@ static int tc358743_probe(struct i2c_client *client,
|
||||
if (err)
|
||||
goto err_work_queues;
|
||||
|
||||
err = v4l2_async_register_subdev(sd);
|
||||
if (err < 0)
|
||||
goto err_work_queues;
|
||||
|
||||
v4l2_info(sd, "%s found @ 0x%x (%s)\n", client->name,
|
||||
client->addr << 1, client->adapter->name);
|
||||
|
||||
|
||||
@@ -3990,6 +3990,10 @@ static int em28xx_usb_probe(struct usb_interface *intf,
|
||||
* topology will likely change after the load of the em28xx subdrivers.
|
||||
*/
|
||||
#ifdef CONFIG_MEDIA_CONTROLLER
|
||||
/*
|
||||
* No need to check the return value, the device will still be
|
||||
* usable without media controller API.
|
||||
*/
|
||||
retval = media_device_register(dev->media_dev);
|
||||
#endif
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ static int go7007_load_encoder(struct go7007 *go)
|
||||
const struct firmware *fw_entry;
|
||||
char fw_name[] = "go7007/go7007fw.bin";
|
||||
void *bounce;
|
||||
int fw_len, rv = 0;
|
||||
int fw_len;
|
||||
u16 intr_val, intr_data;
|
||||
|
||||
if (go->boot_fw == NULL) {
|
||||
@@ -117,9 +117,11 @@ static int go7007_load_encoder(struct go7007 *go)
|
||||
go7007_read_interrupt(go, &intr_val, &intr_data) < 0 ||
|
||||
(intr_val & ~0x1) != 0x5a5a) {
|
||||
v4l2_err(go, "error transferring firmware\n");
|
||||
rv = -1;
|
||||
kfree(go->boot_fw);
|
||||
go->boot_fw = NULL;
|
||||
return -1;
|
||||
}
|
||||
return rv;
|
||||
return 0;
|
||||
}
|
||||
|
||||
MODULE_FIRMWARE("go7007/go7007fw.bin");
|
||||
|
||||
@@ -1206,7 +1206,9 @@ static int go7007_usb_probe(struct usb_interface *intf,
|
||||
u16 channel;
|
||||
|
||||
/* read channel number from GPIO[1:0] */
|
||||
go7007_read_addr(go, 0x3c81, &channel);
|
||||
if (go7007_read_addr(go, 0x3c81, &channel))
|
||||
goto allocfail;
|
||||
|
||||
channel &= 0x3;
|
||||
go->board_id = GO7007_BOARDID_ADLINK_MPG24;
|
||||
usb->board = board = &board_adlink_mpg24;
|
||||
|
||||
@@ -99,8 +99,10 @@ static void pvr2_context_destroy(struct pvr2_context *mp)
|
||||
}
|
||||
|
||||
|
||||
static void pvr2_context_notify(struct pvr2_context *mp)
|
||||
static void pvr2_context_notify(void *ptr)
|
||||
{
|
||||
struct pvr2_context *mp = ptr;
|
||||
|
||||
pvr2_context_set_notify(mp,!0);
|
||||
}
|
||||
|
||||
@@ -115,9 +117,7 @@ static void pvr2_context_check(struct pvr2_context *mp)
|
||||
pvr2_trace(PVR2_TRACE_CTXT,
|
||||
"pvr2_context %p (initialize)", mp);
|
||||
/* Finish hardware initialization */
|
||||
if (pvr2_hdw_initialize(mp->hdw,
|
||||
(void (*)(void *))pvr2_context_notify,
|
||||
mp)) {
|
||||
if (pvr2_hdw_initialize(mp->hdw, pvr2_context_notify, mp)) {
|
||||
mp->video_stream.stream =
|
||||
pvr2_hdw_get_video_stream(mp->hdw);
|
||||
/* Trigger interface initialization. By doing this
|
||||
@@ -276,9 +276,9 @@ static void pvr2_context_exit(struct pvr2_context *mp)
|
||||
void pvr2_context_disconnect(struct pvr2_context *mp)
|
||||
{
|
||||
pvr2_hdw_disconnect(mp->hdw);
|
||||
mp->disconnect_flag = !0;
|
||||
if (!pvr2_context_shutok())
|
||||
pvr2_context_notify(mp);
|
||||
mp->disconnect_flag = !0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -97,8 +97,10 @@ static int pvr2_dvb_feed_thread(void *data)
|
||||
return stat;
|
||||
}
|
||||
|
||||
static void pvr2_dvb_notify(struct pvr2_dvb_adapter *adap)
|
||||
static void pvr2_dvb_notify(void *ptr)
|
||||
{
|
||||
struct pvr2_dvb_adapter *adap = ptr;
|
||||
|
||||
wake_up(&adap->buffer_wait_data);
|
||||
}
|
||||
|
||||
@@ -158,7 +160,7 @@ static int pvr2_dvb_stream_do_start(struct pvr2_dvb_adapter *adap)
|
||||
}
|
||||
|
||||
pvr2_stream_set_callback(pvr->video_stream.stream,
|
||||
(pvr2_stream_callback) pvr2_dvb_notify, adap);
|
||||
pvr2_dvb_notify, adap);
|
||||
|
||||
ret = pvr2_stream_set_buffer_count(stream, PVR2_DVB_BUFFER_COUNT);
|
||||
if (ret < 0) return ret;
|
||||
|
||||
@@ -1055,8 +1055,10 @@ static int pvr2_v4l2_open(struct file *file)
|
||||
}
|
||||
|
||||
|
||||
static void pvr2_v4l2_notify(struct pvr2_v4l2_fh *fhp)
|
||||
static void pvr2_v4l2_notify(void *ptr)
|
||||
{
|
||||
struct pvr2_v4l2_fh *fhp = ptr;
|
||||
|
||||
wake_up(&fhp->wait_data);
|
||||
}
|
||||
|
||||
@@ -1089,7 +1091,7 @@ static int pvr2_v4l2_iosetup(struct pvr2_v4l2_fh *fh)
|
||||
|
||||
hdw = fh->channel.mc_head->hdw;
|
||||
sp = fh->pdi->stream->stream;
|
||||
pvr2_stream_set_callback(sp,(pvr2_stream_callback)pvr2_v4l2_notify,fh);
|
||||
pvr2_stream_set_callback(sp, pvr2_v4l2_notify, fh);
|
||||
pvr2_hdw_set_stream_type(hdw,fh->pdi->config);
|
||||
if ((ret = pvr2_hdw_set_streaming(hdw,!0)) < 0) return ret;
|
||||
return pvr2_ioread_set_enabled(fh->rhp,!0);
|
||||
|
||||
@@ -775,11 +775,17 @@ static int v4l2_m2m_register_entity(struct media_device *mdev,
|
||||
entity->function = function;
|
||||
|
||||
ret = media_entity_pads_init(entity, num_pads, pads);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(entity->name);
|
||||
entity->name = NULL;
|
||||
return ret;
|
||||
}
|
||||
ret = media_device_register_entity(mdev, entity);
|
||||
if (ret)
|
||||
if (ret) {
|
||||
kfree(entity->name);
|
||||
entity->name = NULL;
|
||||
return ret;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -211,7 +211,9 @@ struct regmap *syscon_regmap_lookup_by_phandle(struct device_node *np,
|
||||
return ERR_PTR(-ENODEV);
|
||||
|
||||
regmap = syscon_node_to_regmap(syscon_np);
|
||||
of_node_put(syscon_np);
|
||||
|
||||
if (property)
|
||||
of_node_put(syscon_np);
|
||||
|
||||
return regmap;
|
||||
}
|
||||
|
||||
@@ -893,7 +893,6 @@ static int wmt_mci_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct mmc_host *mmc;
|
||||
struct wmt_mci_priv *priv;
|
||||
struct resource *res;
|
||||
u32 reg_tmp;
|
||||
|
||||
mmc = platform_get_drvdata(pdev);
|
||||
@@ -921,9 +920,6 @@ static int wmt_mci_remove(struct platform_device *pdev)
|
||||
clk_disable_unprepare(priv->clk_sdmmc);
|
||||
clk_put(priv->clk_sdmmc);
|
||||
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
release_mem_region(res->start, resource_size(res));
|
||||
|
||||
mmc_free_host(mmc);
|
||||
|
||||
dev_info(&pdev->dev, "WMT MCI device removed\n");
|
||||
|
||||
@@ -316,8 +316,9 @@ static int lpc32xx_nand_device_ready(struct mtd_info *mtd)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t lpc3xxx_nand_irq(int irq, struct lpc32xx_nand_host *host)
|
||||
static irqreturn_t lpc3xxx_nand_irq(int irq, void *data)
|
||||
{
|
||||
struct lpc32xx_nand_host *host = data;
|
||||
uint8_t sr;
|
||||
|
||||
/* Clear interrupt flag by reading status */
|
||||
@@ -790,7 +791,7 @@ static int lpc32xx_nand_probe(struct platform_device *pdev)
|
||||
goto release_dma_chan;
|
||||
}
|
||||
|
||||
if (request_irq(host->irq, (irq_handler_t)&lpc3xxx_nand_irq,
|
||||
if (request_irq(host->irq, &lpc3xxx_nand_irq,
|
||||
IRQF_TRIGGER_HIGH, DRV_NAME, host)) {
|
||||
dev_err(&pdev->dev, "Error requesting NAND IRQ\n");
|
||||
res = -ENXIO;
|
||||
|
||||
@@ -1008,9 +1008,6 @@ static inline void bnx2x_set_fw_mac_addr(__le16 *fw_hi, __le16 *fw_mid,
|
||||
static inline void bnx2x_free_rx_mem_pool(struct bnx2x *bp,
|
||||
struct bnx2x_alloc_pool *pool)
|
||||
{
|
||||
if (!pool->page)
|
||||
return;
|
||||
|
||||
put_page(pool->page);
|
||||
|
||||
pool->page = NULL;
|
||||
@@ -1021,6 +1018,9 @@ static inline void bnx2x_free_rx_sge_range(struct bnx2x *bp,
|
||||
{
|
||||
int i;
|
||||
|
||||
if (!fp->page_pool.page)
|
||||
return;
|
||||
|
||||
if (fp->mode == TPA_MODE_DISABLED)
|
||||
return;
|
||||
|
||||
|
||||
@@ -6511,77 +6511,75 @@ void igb_update_stats(struct igb_adapter *adapter)
|
||||
}
|
||||
}
|
||||
|
||||
static void igb_perout(struct igb_adapter *adapter, int tsintr_tt)
|
||||
{
|
||||
int pin = ptp_find_pin(adapter->ptp_clock, PTP_PF_PEROUT, tsintr_tt);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
struct timespec64 ts;
|
||||
u32 tsauxc;
|
||||
|
||||
if (pin < 0 || pin >= IGB_N_PEROUT)
|
||||
return;
|
||||
|
||||
spin_lock(&adapter->tmreg_lock);
|
||||
ts = timespec64_add(adapter->perout[pin].start,
|
||||
adapter->perout[pin].period);
|
||||
/* u32 conversion of tv_sec is safe until y2106 */
|
||||
wr32((tsintr_tt == 1) ? E1000_TRGTTIML1 : E1000_TRGTTIML0, ts.tv_nsec);
|
||||
wr32((tsintr_tt == 1) ? E1000_TRGTTIMH1 : E1000_TRGTTIMH0, (u32)ts.tv_sec);
|
||||
tsauxc = rd32(E1000_TSAUXC);
|
||||
tsauxc |= TSAUXC_EN_TT0;
|
||||
wr32(E1000_TSAUXC, tsauxc);
|
||||
adapter->perout[pin].start = ts;
|
||||
spin_unlock(&adapter->tmreg_lock);
|
||||
}
|
||||
|
||||
static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)
|
||||
{
|
||||
int pin = ptp_find_pin(adapter->ptp_clock, PTP_PF_EXTTS, tsintr_tt);
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
struct ptp_clock_event event;
|
||||
u32 sec, nsec;
|
||||
|
||||
if (pin < 0 || pin >= IGB_N_EXTTS)
|
||||
return;
|
||||
|
||||
nsec = rd32((tsintr_tt == 1) ? E1000_AUXSTMPL1 : E1000_AUXSTMPL0);
|
||||
sec = rd32((tsintr_tt == 1) ? E1000_AUXSTMPH1 : E1000_AUXSTMPH0);
|
||||
event.type = PTP_CLOCK_EXTTS;
|
||||
event.index = tsintr_tt;
|
||||
event.timestamp = sec * 1000000000ULL + nsec;
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
}
|
||||
|
||||
static void igb_tsync_interrupt(struct igb_adapter *adapter)
|
||||
{
|
||||
struct e1000_hw *hw = &adapter->hw;
|
||||
u32 tsicr = rd32(E1000_TSICR);
|
||||
struct ptp_clock_event event;
|
||||
struct timespec64 ts;
|
||||
u32 ack = 0, tsauxc, sec, nsec, tsicr = rd32(E1000_TSICR);
|
||||
|
||||
if (tsicr & TSINTR_SYS_WRAP) {
|
||||
event.type = PTP_CLOCK_PPS;
|
||||
if (adapter->ptp_caps.pps)
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= TSINTR_SYS_WRAP;
|
||||
}
|
||||
|
||||
if (tsicr & E1000_TSICR_TXTS) {
|
||||
/* retrieve hardware timestamp */
|
||||
schedule_work(&adapter->ptp_tx_work);
|
||||
ack |= E1000_TSICR_TXTS;
|
||||
}
|
||||
|
||||
if (tsicr & TSINTR_TT0) {
|
||||
spin_lock(&adapter->tmreg_lock);
|
||||
ts = timespec64_add(adapter->perout[0].start,
|
||||
adapter->perout[0].period);
|
||||
/* u32 conversion of tv_sec is safe until y2106 */
|
||||
wr32(E1000_TRGTTIML0, ts.tv_nsec);
|
||||
wr32(E1000_TRGTTIMH0, (u32)ts.tv_sec);
|
||||
tsauxc = rd32(E1000_TSAUXC);
|
||||
tsauxc |= TSAUXC_EN_TT0;
|
||||
wr32(E1000_TSAUXC, tsauxc);
|
||||
adapter->perout[0].start = ts;
|
||||
spin_unlock(&adapter->tmreg_lock);
|
||||
ack |= TSINTR_TT0;
|
||||
}
|
||||
if (tsicr & TSINTR_TT0)
|
||||
igb_perout(adapter, 0);
|
||||
|
||||
if (tsicr & TSINTR_TT1) {
|
||||
spin_lock(&adapter->tmreg_lock);
|
||||
ts = timespec64_add(adapter->perout[1].start,
|
||||
adapter->perout[1].period);
|
||||
wr32(E1000_TRGTTIML1, ts.tv_nsec);
|
||||
wr32(E1000_TRGTTIMH1, (u32)ts.tv_sec);
|
||||
tsauxc = rd32(E1000_TSAUXC);
|
||||
tsauxc |= TSAUXC_EN_TT1;
|
||||
wr32(E1000_TSAUXC, tsauxc);
|
||||
adapter->perout[1].start = ts;
|
||||
spin_unlock(&adapter->tmreg_lock);
|
||||
ack |= TSINTR_TT1;
|
||||
}
|
||||
if (tsicr & TSINTR_TT1)
|
||||
igb_perout(adapter, 1);
|
||||
|
||||
if (tsicr & TSINTR_AUTT0) {
|
||||
nsec = rd32(E1000_AUXSTMPL0);
|
||||
sec = rd32(E1000_AUXSTMPH0);
|
||||
event.type = PTP_CLOCK_EXTTS;
|
||||
event.index = 0;
|
||||
event.timestamp = sec * 1000000000ULL + nsec;
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= TSINTR_AUTT0;
|
||||
}
|
||||
if (tsicr & TSINTR_AUTT0)
|
||||
igb_extts(adapter, 0);
|
||||
|
||||
if (tsicr & TSINTR_AUTT1) {
|
||||
nsec = rd32(E1000_AUXSTMPL1);
|
||||
sec = rd32(E1000_AUXSTMPH1);
|
||||
event.type = PTP_CLOCK_EXTTS;
|
||||
event.index = 1;
|
||||
event.timestamp = sec * 1000000000ULL + nsec;
|
||||
ptp_clock_event(adapter->ptp_clock, &event);
|
||||
ack |= TSINTR_AUTT1;
|
||||
}
|
||||
|
||||
/* acknowledge the interrupts */
|
||||
wr32(E1000_TSICR, ack);
|
||||
if (tsicr & TSINTR_AUTT1)
|
||||
igb_extts(adapter, 1);
|
||||
}
|
||||
|
||||
static irqreturn_t igb_msix_other(int irq, void *data)
|
||||
|
||||
@@ -336,6 +336,11 @@ static void nfp_fl_lag_do_work(struct work_struct *work)
|
||||
|
||||
acti_netdevs = kmalloc_array(entry->slave_cnt,
|
||||
sizeof(*acti_netdevs), GFP_KERNEL);
|
||||
if (!acti_netdevs) {
|
||||
schedule_delayed_work(&lag->work,
|
||||
NFP_FL_LAG_DELAY);
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Include sanity check in the loop. It may be that a bond has
|
||||
* changed between processing the last notification and the
|
||||
|
||||
@@ -737,7 +737,9 @@ static int sr9800_bind(struct usbnet *dev, struct usb_interface *intf)
|
||||
|
||||
data->eeprom_len = SR9800_EEPROM_LEN;
|
||||
|
||||
usbnet_get_endpoints(dev, intf);
|
||||
ret = usbnet_get_endpoints(dev, intf);
|
||||
if (ret)
|
||||
goto out;
|
||||
|
||||
/* LED Setting Rule :
|
||||
* AABB:CCDD
|
||||
|
||||
@@ -684,6 +684,10 @@ ath10k_wmi_tlv_op_pull_mgmt_tx_compl_ev(struct ath10k *ar, struct sk_buff *skb,
|
||||
}
|
||||
|
||||
ev = tb[WMI_TLV_TAG_STRUCT_MGMT_TX_COMPL_EVENT];
|
||||
if (!ev) {
|
||||
kfree(tb);
|
||||
return -EPROTO;
|
||||
}
|
||||
|
||||
arg->desc_id = ev->desc_id;
|
||||
arg->status = ev->status;
|
||||
|
||||
@@ -1082,6 +1082,22 @@ static inline bool b43_using_pio_transfers(struct b43_wldev *dev)
|
||||
return dev->__using_pio_transfers;
|
||||
}
|
||||
|
||||
static inline void b43_wake_queue(struct b43_wldev *dev, int queue_prio)
|
||||
{
|
||||
if (dev->qos_enabled)
|
||||
ieee80211_wake_queue(dev->wl->hw, queue_prio);
|
||||
else
|
||||
ieee80211_wake_queue(dev->wl->hw, 0);
|
||||
}
|
||||
|
||||
static inline void b43_stop_queue(struct b43_wldev *dev, int queue_prio)
|
||||
{
|
||||
if (dev->qos_enabled)
|
||||
ieee80211_stop_queue(dev->wl->hw, queue_prio);
|
||||
else
|
||||
ieee80211_stop_queue(dev->wl->hw, 0);
|
||||
}
|
||||
|
||||
/* Message printing */
|
||||
__printf(2, 3) void b43info(struct b43_wl *wl, const char *fmt, ...);
|
||||
__printf(2, 3) void b43err(struct b43_wl *wl, const char *fmt, ...);
|
||||
|
||||
@@ -1461,8 +1461,8 @@ int b43_dma_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||
should_inject_overflow(ring)) {
|
||||
/* This TX ring is full. */
|
||||
unsigned int skb_mapping = skb_get_queue_mapping(skb);
|
||||
ieee80211_stop_queue(dev->wl->hw, skb_mapping);
|
||||
dev->wl->tx_queue_stopped[skb_mapping] = 1;
|
||||
b43_stop_queue(dev, skb_mapping);
|
||||
dev->wl->tx_queue_stopped[skb_mapping] = true;
|
||||
ring->stopped = true;
|
||||
if (b43_debug(dev, B43_DBG_DMAVERBOSE)) {
|
||||
b43dbg(dev->wl, "Stopped TX ring %d\n", ring->index);
|
||||
@@ -1628,11 +1628,11 @@ void b43_dma_handle_txstatus(struct b43_wldev *dev,
|
||||
}
|
||||
|
||||
if (dev->wl->tx_queue_stopped[ring->queue_prio]) {
|
||||
dev->wl->tx_queue_stopped[ring->queue_prio] = 0;
|
||||
dev->wl->tx_queue_stopped[ring->queue_prio] = false;
|
||||
} else {
|
||||
/* If the driver queue is running wake the corresponding
|
||||
* mac80211 queue. */
|
||||
ieee80211_wake_queue(dev->wl->hw, ring->queue_prio);
|
||||
b43_wake_queue(dev, ring->queue_prio);
|
||||
if (b43_debug(dev, B43_DBG_DMAVERBOSE)) {
|
||||
b43dbg(dev->wl, "Woke up TX ring %d\n", ring->index);
|
||||
}
|
||||
|
||||
@@ -2605,7 +2605,8 @@ static void b43_request_firmware(struct work_struct *work)
|
||||
|
||||
start_ieee80211:
|
||||
wl->hw->queues = B43_QOS_QUEUE_NUM;
|
||||
if (!modparam_qos || dev->fw.opensource)
|
||||
if (!modparam_qos || dev->fw.opensource ||
|
||||
dev->dev->chip_id == BCMA_CHIP_ID_BCM4331)
|
||||
wl->hw->queues = 1;
|
||||
|
||||
err = ieee80211_register_hw(wl->hw);
|
||||
@@ -3625,8 +3626,8 @@ static void b43_tx_work(struct work_struct *work)
|
||||
else
|
||||
err = b43_dma_tx(dev, skb);
|
||||
if (err == -ENOSPC) {
|
||||
wl->tx_queue_stopped[queue_num] = 1;
|
||||
ieee80211_stop_queue(wl->hw, queue_num);
|
||||
wl->tx_queue_stopped[queue_num] = true;
|
||||
b43_stop_queue(dev, queue_num);
|
||||
skb_queue_head(&wl->tx_queue[queue_num], skb);
|
||||
break;
|
||||
}
|
||||
@@ -3636,7 +3637,7 @@ static void b43_tx_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
if (!err)
|
||||
wl->tx_queue_stopped[queue_num] = 0;
|
||||
wl->tx_queue_stopped[queue_num] = false;
|
||||
}
|
||||
|
||||
#if B43_DEBUG
|
||||
@@ -3650,6 +3651,7 @@ static void b43_op_tx(struct ieee80211_hw *hw,
|
||||
struct sk_buff *skb)
|
||||
{
|
||||
struct b43_wl *wl = hw_to_b43_wl(hw);
|
||||
u16 skb_queue_mapping;
|
||||
|
||||
if (unlikely(skb->len < 2 + 2 + 6)) {
|
||||
/* Too short, this can't be a valid frame. */
|
||||
@@ -3658,12 +3660,12 @@ static void b43_op_tx(struct ieee80211_hw *hw,
|
||||
}
|
||||
B43_WARN_ON(skb_shinfo(skb)->nr_frags);
|
||||
|
||||
skb_queue_tail(&wl->tx_queue[skb->queue_mapping], skb);
|
||||
if (!wl->tx_queue_stopped[skb->queue_mapping]) {
|
||||
skb_queue_mapping = skb_get_queue_mapping(skb);
|
||||
skb_queue_tail(&wl->tx_queue[skb_queue_mapping], skb);
|
||||
if (!wl->tx_queue_stopped[skb_queue_mapping])
|
||||
ieee80211_queue_work(wl->hw, &wl->tx_work);
|
||||
} else {
|
||||
ieee80211_stop_queue(wl->hw, skb->queue_mapping);
|
||||
}
|
||||
else
|
||||
b43_stop_queue(wl->current_dev, skb_queue_mapping);
|
||||
}
|
||||
|
||||
static void b43_qos_params_upload(struct b43_wldev *dev,
|
||||
@@ -5630,7 +5632,7 @@ static struct b43_wl *b43_wireless_init(struct b43_bus_dev *dev)
|
||||
/* Initialize queues and flags. */
|
||||
for (queue_num = 0; queue_num < B43_QOS_QUEUE_NUM; queue_num++) {
|
||||
skb_queue_head_init(&wl->tx_queue[queue_num]);
|
||||
wl->tx_queue_stopped[queue_num] = 0;
|
||||
wl->tx_queue_stopped[queue_num] = false;
|
||||
}
|
||||
|
||||
snprintf(chip_name, ARRAY_SIZE(chip_name),
|
||||
|
||||
@@ -538,7 +538,7 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||
if (total_len > (q->buffer_size - q->buffer_used)) {
|
||||
/* Not enough memory on the queue. */
|
||||
err = -EBUSY;
|
||||
ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
|
||||
b43_stop_queue(dev, skb_get_queue_mapping(skb));
|
||||
q->stopped = true;
|
||||
goto out;
|
||||
}
|
||||
@@ -565,7 +565,7 @@ int b43_pio_tx(struct b43_wldev *dev, struct sk_buff *skb)
|
||||
if (((q->buffer_size - q->buffer_used) < roundup(2 + 2 + 6, 4)) ||
|
||||
(q->free_packet_slots == 0)) {
|
||||
/* The queue is full. */
|
||||
ieee80211_stop_queue(dev->wl->hw, skb_get_queue_mapping(skb));
|
||||
b43_stop_queue(dev, skb_get_queue_mapping(skb));
|
||||
q->stopped = true;
|
||||
}
|
||||
|
||||
@@ -600,7 +600,7 @@ void b43_pio_handle_txstatus(struct b43_wldev *dev,
|
||||
list_add(&pack->list, &q->packets_list);
|
||||
|
||||
if (q->stopped) {
|
||||
ieee80211_wake_queue(dev->wl->hw, q->queue_prio);
|
||||
b43_wake_queue(dev, q->queue_prio);
|
||||
q->stopped = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -394,8 +394,9 @@ struct shared_phy *wlc_phy_shared_attach(struct shared_phy_params *shp)
|
||||
return sh;
|
||||
}
|
||||
|
||||
static void wlc_phy_timercb_phycal(struct brcms_phy *pi)
|
||||
static void wlc_phy_timercb_phycal(void *ptr)
|
||||
{
|
||||
struct brcms_phy *pi = ptr;
|
||||
uint delay = 5;
|
||||
|
||||
if (PHY_PERICAL_MPHASE_PENDING(pi)) {
|
||||
|
||||
@@ -57,12 +57,11 @@ void wlc_phy_shim_detach(struct phy_shim_info *physhim)
|
||||
}
|
||||
|
||||
struct wlapi_timer *wlapi_init_timer(struct phy_shim_info *physhim,
|
||||
void (*fn)(struct brcms_phy *pi),
|
||||
void (*fn)(void *pi),
|
||||
void *arg, const char *name)
|
||||
{
|
||||
return (struct wlapi_timer *)
|
||||
brcms_init_timer(physhim->wl, (void (*)(void *))fn,
|
||||
arg, name);
|
||||
brcms_init_timer(physhim->wl, fn, arg, name);
|
||||
}
|
||||
|
||||
void wlapi_free_timer(struct wlapi_timer *t)
|
||||
|
||||
@@ -131,7 +131,7 @@ void wlc_phy_shim_detach(struct phy_shim_info *physhim);
|
||||
|
||||
/* PHY to WL utility functions */
|
||||
struct wlapi_timer *wlapi_init_timer(struct phy_shim_info *physhim,
|
||||
void (*fn)(struct brcms_phy *pi),
|
||||
void (*fn)(void *pi),
|
||||
void *arg, const char *name);
|
||||
void wlapi_free_timer(struct wlapi_timer *t);
|
||||
void wlapi_add_timer(struct wlapi_timer *t, uint ms, int periodic);
|
||||
|
||||
@@ -1132,7 +1132,7 @@ int lbs_allocate_cmd_buffer(struct lbs_private *priv)
|
||||
if (!cmdarray[i].cmdbuf) {
|
||||
lbs_deb_host("ALLOC_CMD_BUF: ptempvirtualaddr is NULL\n");
|
||||
ret = -1;
|
||||
goto done;
|
||||
goto free_cmd_array;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1140,8 +1140,17 @@ int lbs_allocate_cmd_buffer(struct lbs_private *priv)
|
||||
init_waitqueue_head(&cmdarray[i].cmdwait_q);
|
||||
lbs_cleanup_and_insert_cmd(priv, &cmdarray[i]);
|
||||
}
|
||||
ret = 0;
|
||||
return 0;
|
||||
|
||||
free_cmd_array:
|
||||
for (i = 0; i < LBS_NUM_CMD_BUFFERS; i++) {
|
||||
if (cmdarray[i].cmdbuf) {
|
||||
kfree(cmdarray[i].cmdbuf);
|
||||
cmdarray[i].cmdbuf = NULL;
|
||||
}
|
||||
}
|
||||
kfree(priv->cmd_array);
|
||||
priv->cmd_array = NULL;
|
||||
done:
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -977,9 +977,6 @@ mwifiex_dev_debugfs_init(struct mwifiex_private *priv)
|
||||
priv->dfs_dev_dir = debugfs_create_dir(priv->netdev->name,
|
||||
mwifiex_dfs_dir);
|
||||
|
||||
if (!priv->dfs_dev_dir)
|
||||
return;
|
||||
|
||||
MWIFIEX_DFS_ADD_FILE(info);
|
||||
MWIFIEX_DFS_ADD_FILE(debug);
|
||||
MWIFIEX_DFS_ADD_FILE(getlog);
|
||||
|
||||
@@ -5189,6 +5189,7 @@ static void quirk_no_ext_tags(struct pci_dev *pdev)
|
||||
|
||||
pci_walk_bus(bridge->bus, pci_configure_extended_tags, NULL);
|
||||
}
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_3WARE, 0x1004, quirk_no_ext_tags);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0132, quirk_no_ext_tags);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0140, quirk_no_ext_tags);
|
||||
DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, 0x0141, quirk_no_ext_tags);
|
||||
|
||||
@@ -1719,7 +1719,8 @@ config RTC_DRV_MOXART
|
||||
|
||||
config RTC_DRV_MT6397
|
||||
tristate "MediaTek PMIC based RTC"
|
||||
depends on MFD_MT6397 || (COMPILE_TEST && IRQ_DOMAIN)
|
||||
depends on MFD_MT6397 || COMPILE_TEST
|
||||
select IRQ_DOMAIN
|
||||
help
|
||||
This selects the MediaTek(R) RTC driver. RTC is part of MediaTek
|
||||
MT6397 PMIC. You should enable MT6397 PMIC MFD before select
|
||||
|
||||
@@ -28,7 +28,6 @@
|
||||
struct bfa_s;
|
||||
|
||||
typedef void (*bfa_isr_func_t) (struct bfa_s *bfa, struct bfi_msg_s *m);
|
||||
typedef void (*bfa_cb_cbfn_status_t) (void *cbarg, bfa_status_t status);
|
||||
|
||||
/*
|
||||
* Interrupt message handlers
|
||||
@@ -446,4 +445,12 @@ struct bfa_cb_pending_q_s {
|
||||
(__qe)->data = (__data); \
|
||||
} while (0)
|
||||
|
||||
#define bfa_pending_q_init_status(__qe, __cbfn, __cbarg, __data) do { \
|
||||
bfa_q_qe_init(&((__qe)->hcb_qe.qe)); \
|
||||
(__qe)->hcb_qe.cbfn_status = (__cbfn); \
|
||||
(__qe)->hcb_qe.cbarg = (__cbarg); \
|
||||
(__qe)->hcb_qe.pre_rmv = BFA_TRUE; \
|
||||
(__qe)->data = (__data); \
|
||||
} while (0)
|
||||
|
||||
#endif /* __BFA_H__ */
|
||||
|
||||
@@ -1915,15 +1915,13 @@ bfa_comp_process(struct bfa_s *bfa, struct list_head *comp_q)
|
||||
struct list_head *qe;
|
||||
struct list_head *qen;
|
||||
struct bfa_cb_qe_s *hcb_qe;
|
||||
bfa_cb_cbfn_status_t cbfn;
|
||||
|
||||
list_for_each_safe(qe, qen, comp_q) {
|
||||
hcb_qe = (struct bfa_cb_qe_s *) qe;
|
||||
if (hcb_qe->pre_rmv) {
|
||||
/* qe is invalid after return, dequeue before cbfn() */
|
||||
list_del(qe);
|
||||
cbfn = (bfa_cb_cbfn_status_t)(hcb_qe->cbfn);
|
||||
cbfn(hcb_qe->cbarg, hcb_qe->fw_status);
|
||||
hcb_qe->cbfn_status(hcb_qe->cbarg, hcb_qe->fw_status);
|
||||
} else
|
||||
hcb_qe->cbfn(hcb_qe->cbarg, BFA_TRUE);
|
||||
}
|
||||
|
||||
@@ -369,14 +369,18 @@ struct bfa_reqq_wait_s {
|
||||
void *cbarg;
|
||||
};
|
||||
|
||||
typedef void (*bfa_cb_cbfn_t) (void *cbarg, bfa_boolean_t complete);
|
||||
typedef void (*bfa_cb_cbfn_t) (void *cbarg, bfa_boolean_t complete);
|
||||
typedef void (*bfa_cb_cbfn_status_t) (void *cbarg, bfa_status_t status);
|
||||
|
||||
/*
|
||||
* Generic BFA callback element.
|
||||
*/
|
||||
struct bfa_cb_qe_s {
|
||||
struct list_head qe;
|
||||
bfa_cb_cbfn_t cbfn;
|
||||
union {
|
||||
bfa_cb_cbfn_status_t cbfn_status;
|
||||
bfa_cb_cbfn_t cbfn;
|
||||
};
|
||||
bfa_boolean_t once;
|
||||
bfa_boolean_t pre_rmv; /* set for stack based qe(s) */
|
||||
bfa_status_t fw_status; /* to access fw status in comp proc */
|
||||
|
||||
@@ -2143,8 +2143,7 @@ bfad_iocmd_fcport_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
struct bfa_cb_pending_q_s cb_qe;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
|
||||
&fcomp, &iocmd->stats);
|
||||
bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, &iocmd->stats);
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fcport_get_stats(&bfad->bfa, &cb_qe);
|
||||
spin_unlock_irqrestore(&bfad->bfad_lock, flags);
|
||||
@@ -2167,7 +2166,7 @@ bfad_iocmd_fcport_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
struct bfa_cb_pending_q_s cb_qe;
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp, &fcomp, NULL);
|
||||
bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, NULL);
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
iocmd->status = bfa_fcport_clear_stats(&bfad->bfa, &cb_qe);
|
||||
@@ -2451,8 +2450,7 @@ bfad_iocmd_qos_get_stats(struct bfad_s *bfad, void *cmd)
|
||||
struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
|
||||
&fcomp, &iocmd->stats);
|
||||
bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, &iocmd->stats);
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
|
||||
@@ -2482,8 +2480,7 @@ bfad_iocmd_qos_reset_stats(struct bfad_s *bfad, void *cmd)
|
||||
struct bfa_fcport_s *fcport = BFA_FCPORT_MOD(&bfad->bfa);
|
||||
|
||||
init_completion(&fcomp.comp);
|
||||
bfa_pending_q_init(&cb_qe, (bfa_cb_cbfn_t)bfad_hcb_comp,
|
||||
&fcomp, NULL);
|
||||
bfa_pending_q_init_status(&cb_qe, bfad_hcb_comp, &fcomp, NULL);
|
||||
|
||||
spin_lock_irqsave(&bfad->bfad_lock, flags);
|
||||
WARN_ON(!bfa_ioc_get_fcmode(&bfad->bfa.ioc));
|
||||
|
||||
@@ -73,7 +73,21 @@ csio_list_deleted(struct list_head *list)
|
||||
#define csio_list_prev(elem) (((struct list_head *)(elem))->prev)
|
||||
|
||||
/* State machine */
|
||||
typedef void (*csio_sm_state_t)(void *, uint32_t);
|
||||
struct csio_lnode;
|
||||
|
||||
/* State machine evets */
|
||||
enum csio_ln_ev {
|
||||
CSIO_LNE_NONE = (uint32_t)0,
|
||||
CSIO_LNE_LINKUP,
|
||||
CSIO_LNE_FAB_INIT_DONE,
|
||||
CSIO_LNE_LINK_DOWN,
|
||||
CSIO_LNE_DOWN_LINK,
|
||||
CSIO_LNE_LOGO,
|
||||
CSIO_LNE_CLOSE,
|
||||
CSIO_LNE_MAX_EVENT,
|
||||
};
|
||||
|
||||
typedef void (*csio_sm_state_t)(struct csio_lnode *ln, enum csio_ln_ev evt);
|
||||
|
||||
struct csio_sm {
|
||||
struct list_head sm_list;
|
||||
@@ -83,7 +97,7 @@ struct csio_sm {
|
||||
static inline void
|
||||
csio_set_state(void *smp, void *state)
|
||||
{
|
||||
((struct csio_sm *)smp)->sm_state = (csio_sm_state_t)state;
|
||||
((struct csio_sm *)smp)->sm_state = state;
|
||||
}
|
||||
|
||||
static inline void
|
||||
|
||||
@@ -1095,7 +1095,7 @@ csio_handle_link_down(struct csio_hw *hw, uint8_t portid, uint32_t fcfi,
|
||||
int
|
||||
csio_is_lnode_ready(struct csio_lnode *ln)
|
||||
{
|
||||
return (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready));
|
||||
return (csio_get_state(ln) == csio_lns_ready);
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
@@ -1367,15 +1367,15 @@ csio_free_fcfinfo(struct kref *kref)
|
||||
void
|
||||
csio_lnode_state_to_str(struct csio_lnode *ln, int8_t *str)
|
||||
{
|
||||
if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_uninit)) {
|
||||
if (csio_get_state(ln) == csio_lns_uninit) {
|
||||
strcpy(str, "UNINIT");
|
||||
return;
|
||||
}
|
||||
if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_ready)) {
|
||||
if (csio_get_state(ln) == csio_lns_ready) {
|
||||
strcpy(str, "READY");
|
||||
return;
|
||||
}
|
||||
if (csio_get_state(ln) == ((csio_sm_state_t)csio_lns_offline)) {
|
||||
if (csio_get_state(ln) == csio_lns_offline) {
|
||||
strcpy(str, "OFFLINE");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -53,19 +53,6 @@
|
||||
extern int csio_fcoe_rnodes;
|
||||
extern int csio_fdmi_enable;
|
||||
|
||||
/* State machine evets */
|
||||
enum csio_ln_ev {
|
||||
CSIO_LNE_NONE = (uint32_t)0,
|
||||
CSIO_LNE_LINKUP,
|
||||
CSIO_LNE_FAB_INIT_DONE,
|
||||
CSIO_LNE_LINK_DOWN,
|
||||
CSIO_LNE_DOWN_LINK,
|
||||
CSIO_LNE_LOGO,
|
||||
CSIO_LNE_CLOSE,
|
||||
CSIO_LNE_MAX_EVENT,
|
||||
};
|
||||
|
||||
|
||||
struct csio_fcf_info {
|
||||
struct list_head list;
|
||||
uint8_t priority;
|
||||
|
||||
@@ -5584,7 +5584,9 @@ _base_wait_for_iocstate(struct MPT3SAS_ADAPTER *ioc, int timeout)
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
issue_diag_reset:
|
||||
return 0;
|
||||
|
||||
issue_diag_reset:
|
||||
rc = _base_diag_reset(ioc);
|
||||
return rc;
|
||||
}
|
||||
|
||||
@@ -524,17 +524,19 @@ static irqreturn_t mtk_spi_interrupt(int irq, void *dev_id)
|
||||
mdata->xfer_len = min(MTK_SPI_MAX_FIFO_SIZE, len);
|
||||
mtk_spi_setup_packet(master);
|
||||
|
||||
cnt = mdata->xfer_len / 4;
|
||||
iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
|
||||
trans->tx_buf + mdata->num_xfered, cnt);
|
||||
if (trans->tx_buf) {
|
||||
cnt = mdata->xfer_len / 4;
|
||||
iowrite32_rep(mdata->base + SPI_TX_DATA_REG,
|
||||
trans->tx_buf + mdata->num_xfered, cnt);
|
||||
|
||||
remainder = mdata->xfer_len % 4;
|
||||
if (remainder > 0) {
|
||||
reg_val = 0;
|
||||
memcpy(®_val,
|
||||
trans->tx_buf + (cnt * 4) + mdata->num_xfered,
|
||||
remainder);
|
||||
writel(reg_val, mdata->base + SPI_TX_DATA_REG);
|
||||
remainder = mdata->xfer_len % 4;
|
||||
if (remainder > 0) {
|
||||
reg_val = 0;
|
||||
memcpy(®_val,
|
||||
trans->tx_buf + (cnt * 4) + mdata->num_xfered,
|
||||
remainder);
|
||||
writel(reg_val, mdata->base + SPI_TX_DATA_REG);
|
||||
}
|
||||
}
|
||||
|
||||
mtk_spi_enable_transfer(master);
|
||||
|
||||
@@ -102,15 +102,15 @@ static struct led_classdev *get_channel_cdev(struct gb_channel *channel)
|
||||
static struct gb_channel *get_channel_from_mode(struct gb_light *light,
|
||||
u32 mode)
|
||||
{
|
||||
struct gb_channel *channel = NULL;
|
||||
struct gb_channel *channel;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < light->channels_count; i++) {
|
||||
channel = &light->channels[i];
|
||||
if (channel && channel->mode == mode)
|
||||
break;
|
||||
if (channel->mode == mode)
|
||||
return channel;
|
||||
}
|
||||
return channel;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int __gb_lights_flash_intensity_set(struct gb_channel *channel,
|
||||
|
||||
@@ -553,6 +553,7 @@ static void exar_pci_remove(struct pci_dev *pcidev)
|
||||
for (i = 0; i < priv->nr; i++)
|
||||
serial8250_unregister_port(priv->line[i]);
|
||||
|
||||
/* Ensure that every init quirk is properly torn down */
|
||||
if (priv->board->exit)
|
||||
priv->board->exit(pcidev);
|
||||
}
|
||||
@@ -567,10 +568,6 @@ static int __maybe_unused exar_suspend(struct device *dev)
|
||||
if (priv->line[i] >= 0)
|
||||
serial8250_suspend_port(priv->line[i]);
|
||||
|
||||
/* Ensure that every init quirk is properly torn down */
|
||||
if (priv->board->exit)
|
||||
priv->board->exit(pcidev);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -1363,7 +1363,7 @@ static int max310x_probe(struct device *dev, struct max310x_devtype *devtype,
|
||||
if (!ret)
|
||||
return 0;
|
||||
|
||||
dev_err(dev, "Unable to reguest IRQ %i\n", irq);
|
||||
dev_err(dev, "Unable to request IRQ %i\n", irq);
|
||||
|
||||
out_uart:
|
||||
for (i = 0; i < devtype->nr; i++) {
|
||||
|
||||
@@ -800,11 +800,10 @@ static unsigned int s3c24xx_serial_tx_empty(struct uart_port *port)
|
||||
if ((ufstat & info->tx_fifomask) != 0 ||
|
||||
(ufstat & info->tx_fifofull))
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
return TIOCSER_TEMT;
|
||||
}
|
||||
|
||||
return s3c24xx_serial_txempty_nofifo(port);
|
||||
return s3c24xx_serial_txempty_nofifo(port) ? TIOCSER_TEMT : 0;
|
||||
}
|
||||
|
||||
/* no modem control lines */
|
||||
|
||||
@@ -2638,7 +2638,7 @@ net2272_plat_probe(struct platform_device *pdev)
|
||||
goto err_req;
|
||||
}
|
||||
|
||||
ret = net2272_probe_fin(dev, IRQF_TRIGGER_LOW);
|
||||
ret = net2272_probe_fin(dev, irqflags);
|
||||
if (ret)
|
||||
goto err_io;
|
||||
|
||||
|
||||
@@ -122,6 +122,7 @@ static int da9052_backlight_probe(struct platform_device *pdev)
|
||||
wleds->led_reg = platform_get_device_id(pdev)->driver_data;
|
||||
wleds->state = DA9052_WLEDS_OFF;
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.max_brightness = DA9052_MAX_BRIGHTNESS;
|
||||
|
||||
|
||||
@@ -223,7 +223,7 @@ static int lm3630a_bank_a_get_brightness(struct backlight_device *bl)
|
||||
if (rval < 0)
|
||||
goto out_i2c_err;
|
||||
brightness |= rval;
|
||||
goto out;
|
||||
return brightness;
|
||||
}
|
||||
|
||||
/* disable sleep */
|
||||
@@ -234,11 +234,8 @@ static int lm3630a_bank_a_get_brightness(struct backlight_device *bl)
|
||||
rval = lm3630a_read(pchip, REG_BRT_A);
|
||||
if (rval < 0)
|
||||
goto out_i2c_err;
|
||||
brightness = rval;
|
||||
return rval;
|
||||
|
||||
out:
|
||||
bl->props.brightness = brightness;
|
||||
return bl->props.brightness;
|
||||
out_i2c_err:
|
||||
dev_err(pchip->dev, "i2c failed to access register\n");
|
||||
return 0;
|
||||
@@ -300,7 +297,7 @@ static int lm3630a_bank_b_get_brightness(struct backlight_device *bl)
|
||||
if (rval < 0)
|
||||
goto out_i2c_err;
|
||||
brightness |= rval;
|
||||
goto out;
|
||||
return brightness;
|
||||
}
|
||||
|
||||
/* disable sleep */
|
||||
@@ -311,11 +308,8 @@ static int lm3630a_bank_b_get_brightness(struct backlight_device *bl)
|
||||
rval = lm3630a_read(pchip, REG_BRT_B);
|
||||
if (rval < 0)
|
||||
goto out_i2c_err;
|
||||
brightness = rval;
|
||||
return rval;
|
||||
|
||||
out:
|
||||
bl->props.brightness = brightness;
|
||||
return bl->props.brightness;
|
||||
out_i2c_err:
|
||||
dev_err(pchip->dev, "i2c failed to access register\n");
|
||||
return 0;
|
||||
@@ -332,6 +326,7 @@ static int lm3630a_backlight_register(struct lm3630a_chip *pchip)
|
||||
struct backlight_properties props;
|
||||
struct lm3630a_platform_data *pdata = pchip->pdata;
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
if (pdata->leda_ctrl != LM3630A_LEDA_DISABLE) {
|
||||
props.brightness = pdata->leda_init_brt;
|
||||
|
||||
@@ -343,6 +343,7 @@ static int lm3639_probe(struct i2c_client *client,
|
||||
}
|
||||
|
||||
/* backlight */
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_RAW;
|
||||
props.brightness = pdata->init_brt_led;
|
||||
props.max_brightness = pdata->max_brt_led;
|
||||
|
||||
@@ -195,6 +195,7 @@ static int lp8788_backlight_register(struct lp8788_bl *bl)
|
||||
int init_brt;
|
||||
char *name;
|
||||
|
||||
memset(&props, 0, sizeof(struct backlight_properties));
|
||||
props.type = BACKLIGHT_PLATFORM;
|
||||
props.max_brightness = MAX_BRIGHTNESS;
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@ static long do_sys_name_to_handle(struct path *path,
|
||||
if (f_handle.handle_bytes > MAX_HANDLE_SZ)
|
||||
return -EINVAL;
|
||||
|
||||
handle = kmalloc(sizeof(struct file_handle) + f_handle.handle_bytes,
|
||||
handle = kzalloc(sizeof(struct file_handle) + f_handle.handle_bytes,
|
||||
GFP_KERNEL);
|
||||
if (!handle)
|
||||
return -ENOMEM;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user