Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
packages
kernel
linux
Commits
086e5551
Commit
086e5551
authored
Jan 12, 2020
by
Lorenzo "Palinuro" Faletra
Browse files
Import Upstream version 5.4.8
parent
d2ab784c
Changes
624
Hide whitespace changes
Inline
Side-by-side
drivers/clocksource/timer-of.c
View file @
086e5551
...
...
@@ -192,7 +192,7 @@ int __init timer_of_init(struct device_node *np, struct timer_of *to)
}
if
(
!
to
->
clkevt
.
name
)
to
->
clkevt
.
name
=
np
->
name
;
to
->
clkevt
.
name
=
np
->
full_
name
;
to
->
np
=
np
;
...
...
drivers/cpufreq/cpufreq.c
View file @
086e5551
...
...
@@ -2634,6 +2634,13 @@ int cpufreq_register_driver(struct cpufreq_driver *driver_data)
if
(
cpufreq_disabled
())
return
-
ENODEV
;
/*
* The cpufreq core depends heavily on the availability of device
* structure, make sure they are available before proceeding further.
*/
if
(
!
get_cpu_device
(
0
))
return
-
EPROBE_DEFER
;
if
(
!
driver_data
||
!
driver_data
->
verify
||
!
driver_data
->
init
||
!
(
driver_data
->
setpolicy
||
driver_data
->
target_index
||
driver_data
->
target
)
||
...
...
drivers/cpufreq/sun50i-cpufreq-nvmem.c
View file @
086e5551
...
...
@@ -25,7 +25,7 @@
static
struct
platform_device
*
cpufreq_dt_pdev
,
*
sun50i_cpufreq_pdev
;
/**
* sun50i_cpufreq_get_efuse() -
Parse and return efuse value present on SoC
* sun50i_cpufreq_get_efuse() -
Determine speed grade from efuse value
* @versions: Set to the value parsed from efuse
*
* Returns 0 if success.
...
...
@@ -69,21 +69,16 @@ static int sun50i_cpufreq_get_efuse(u32 *versions)
return
PTR_ERR
(
speedbin
);
efuse_value
=
(
*
speedbin
>>
NVMEM_SHIFT
)
&
NVMEM_MASK
;
switch
(
efuse_value
)
{
case
0
b0001
:
*
versions
=
1
;
break
;
case
0
b0011
:
*
versions
=
2
;
break
;
default:
/*
* For other situations, we treat it as bin0.
* This vf table can be run for any good cpu.
*/
/*
* We treat unexpected efuse values as if the SoC was from
* the slowest bin. Expected efuse values are 1-3, slowest
* to fastest.
*/
if
(
efuse_value
>=
1
&&
efuse_value
<=
3
)
*
versions
=
efuse_value
-
1
;
else
*
versions
=
0
;
break
;
}
kfree
(
speedbin
);
return
0
;
...
...
drivers/crypto/atmel-aes.c
View file @
086e5551
...
...
@@ -145,7 +145,7 @@ struct atmel_aes_xts_ctx {
u32
key2
[
AES_KEYSIZE_256
/
sizeof
(
u32
)];
};
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
struct
atmel_aes_authenc_ctx
{
struct
atmel_aes_base_ctx
base
;
struct
atmel_sha_authenc_ctx
*
auth
;
...
...
@@ -157,7 +157,7 @@ struct atmel_aes_reqctx {
u32
lastc
[
AES_BLOCK_SIZE
/
sizeof
(
u32
)];
};
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
struct
atmel_aes_authenc_reqctx
{
struct
atmel_aes_reqctx
base
;
...
...
@@ -486,7 +486,7 @@ static inline bool atmel_aes_is_encrypt(const struct atmel_aes_dev *dd)
return
(
dd
->
flags
&
AES_FLAGS_ENCRYPT
);
}
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
static
void
atmel_aes_authenc_complete
(
struct
atmel_aes_dev
*
dd
,
int
err
);
#endif
...
...
@@ -515,7 +515,7 @@ static void atmel_aes_set_iv_as_last_ciphertext_block(struct atmel_aes_dev *dd)
static
inline
int
atmel_aes_complete
(
struct
atmel_aes_dev
*
dd
,
int
err
)
{
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
if
(
dd
->
ctx
->
is_aead
)
atmel_aes_authenc_complete
(
dd
,
err
);
#endif
...
...
@@ -1980,7 +1980,7 @@ static struct crypto_alg aes_xts_alg = {
}
};
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
/* authenc aead functions */
static
int
atmel_aes_authenc_start
(
struct
atmel_aes_dev
*
dd
);
...
...
@@ -2467,7 +2467,7 @@ static void atmel_aes_unregister_algs(struct atmel_aes_dev *dd)
{
int
i
;
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
if
(
dd
->
caps
.
has_authenc
)
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
aes_authenc_algs
);
i
++
)
crypto_unregister_aead
(
&
aes_authenc_algs
[
i
]);
...
...
@@ -2514,7 +2514,7 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd)
goto
err_aes_xts_alg
;
}
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
if
(
dd
->
caps
.
has_authenc
)
{
for
(
i
=
0
;
i
<
ARRAY_SIZE
(
aes_authenc_algs
);
i
++
)
{
err
=
crypto_register_aead
(
&
aes_authenc_algs
[
i
]);
...
...
@@ -2526,7 +2526,7 @@ static int atmel_aes_register_algs(struct atmel_aes_dev *dd)
return
0
;
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
/* i = ARRAY_SIZE(aes_authenc_algs); */
err_aes_authenc_alg:
for
(
j
=
0
;
j
<
i
;
j
++
)
...
...
@@ -2716,7 +2716,7 @@ static int atmel_aes_probe(struct platform_device *pdev)
atmel_aes_get_cap
(
aes_dd
);
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
if
(
aes_dd
->
caps
.
has_authenc
&&
!
atmel_sha_authenc_is_ready
())
{
err
=
-
EPROBE_DEFER
;
goto
iclk_unprepare
;
...
...
drivers/crypto/atmel-authenc.h
View file @
086e5551
...
...
@@ -12,7 +12,7 @@
#ifndef __ATMEL_AUTHENC_H__
#define __ATMEL_AUTHENC_H__
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
#include
<crypto/authenc.h>
#include
<crypto/hash.h>
...
...
drivers/crypto/atmel-sha.c
View file @
086e5551
...
...
@@ -2212,7 +2212,7 @@ static struct ahash_alg sha_hmac_algs[] = {
},
};
#if
def
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
#if
IS_ENABLED(
CONFIG_CRYPTO_DEV_ATMEL_AUTHENC
)
/* authenc functions */
static
int
atmel_sha_authenc_init2
(
struct
atmel_sha_dev
*
dd
);
...
...
drivers/crypto/inside-secure/safexcel.c
View file @
086e5551
...
...
@@ -1120,6 +1120,8 @@ static int safexcel_request_ring_irq(void *pdev, int irqid,
irq_name
,
irq
);
return
irq
;
}
}
else
{
return
-
ENXIO
;
}
ret
=
devm_request_threaded_irq
(
dev
,
irq
,
handler
,
...
...
drivers/crypto/sunxi-ss/sun4i-ss-cipher.c
View file @
086e5551
...
...
@@ -72,7 +72,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq)
oi
=
0
;
oo
=
0
;
do
{
todo
=
min3
(
rx_cnt
,
ileft
,
(
mi
.
length
-
oi
)
/
4
);
todo
=
min
(
rx_cnt
,
ileft
);
todo
=
min_t
(
size_t
,
todo
,
(
mi
.
length
-
oi
)
/
4
);
if
(
todo
)
{
ileft
-=
todo
;
writesl
(
ss
->
base
+
SS_RXFIFO
,
mi
.
addr
+
oi
,
todo
);
...
...
@@ -87,7 +88,8 @@ static int noinline_for_stack sun4i_ss_opti_poll(struct skcipher_request *areq)
rx_cnt
=
SS_RXFIFO_SPACES
(
spaces
);
tx_cnt
=
SS_TXFIFO_SPACES
(
spaces
);
todo
=
min3
(
tx_cnt
,
oleft
,
(
mo
.
length
-
oo
)
/
4
);
todo
=
min
(
tx_cnt
,
oleft
);
todo
=
min_t
(
size_t
,
todo
,
(
mo
.
length
-
oo
)
/
4
);
if
(
todo
)
{
oleft
-=
todo
;
readsl
(
ss
->
base
+
SS_TXFIFO
,
mo
.
addr
+
oo
,
todo
);
...
...
@@ -239,7 +241,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
* todo is the number of consecutive 4byte word that we
* can read from current SG
*/
todo
=
min3
(
rx_cnt
,
ileft
/
4
,
(
mi
.
length
-
oi
)
/
4
);
todo
=
min
(
rx_cnt
,
ileft
/
4
);
todo
=
min_t
(
size_t
,
todo
,
(
mi
.
length
-
oi
)
/
4
);
if
(
todo
&&
!
ob
)
{
writesl
(
ss
->
base
+
SS_RXFIFO
,
mi
.
addr
+
oi
,
todo
);
...
...
@@ -253,8 +256,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
* we need to be able to write all buf in one
* pass, so it is why we min() with rx_cnt
*/
todo
=
min
3
(
rx_cnt
*
4
-
ob
,
ileft
,
mi
.
length
-
oi
);
todo
=
min
(
rx_cnt
*
4
-
ob
,
ileft
);
todo
=
min_t
(
size_t
,
todo
,
mi
.
length
-
oi
);
memcpy
(
buf
+
ob
,
mi
.
addr
+
oi
,
todo
);
ileft
-=
todo
;
oi
+=
todo
;
...
...
@@ -274,7 +277,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
spaces
=
readl
(
ss
->
base
+
SS_FCSR
);
rx_cnt
=
SS_RXFIFO_SPACES
(
spaces
);
tx_cnt
=
SS_TXFIFO_SPACES
(
spaces
);
dev_dbg
(
ss
->
dev
,
"%x %u/%u %u/%u cnt=%u %u/%u %u/%u cnt=%u %u
\n
"
,
dev_dbg
(
ss
->
dev
,
"%x %u/%zu %u/%u cnt=%u %u/%zu %u/%u cnt=%u %u
\n
"
,
mode
,
oi
,
mi
.
length
,
ileft
,
areq
->
cryptlen
,
rx_cnt
,
oo
,
mo
.
length
,
oleft
,
areq
->
cryptlen
,
tx_cnt
,
ob
);
...
...
@@ -282,7 +286,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
if
(
!
tx_cnt
)
continue
;
/* todo in 4bytes word */
todo
=
min3
(
tx_cnt
,
oleft
/
4
,
(
mo
.
length
-
oo
)
/
4
);
todo
=
min
(
tx_cnt
,
oleft
/
4
);
todo
=
min_t
(
size_t
,
todo
,
(
mo
.
length
-
oo
)
/
4
);
if
(
todo
)
{
readsl
(
ss
->
base
+
SS_TXFIFO
,
mo
.
addr
+
oo
,
todo
);
oleft
-=
todo
*
4
;
...
...
@@ -308,7 +313,8 @@ static int sun4i_ss_cipher_poll(struct skcipher_request *areq)
* no more than remaining buffer
* no need to test against oleft
*/
todo
=
min
(
mo
.
length
-
oo
,
obl
-
obo
);
todo
=
min_t
(
size_t
,
mo
.
length
-
oo
,
obl
-
obo
);
memcpy
(
mo
.
addr
+
oo
,
bufo
+
obo
,
todo
);
oleft
-=
todo
;
obo
+=
todo
;
...
...
drivers/crypto/sunxi-ss/sun4i-ss-hash.c
View file @
086e5551
...
...
@@ -272,8 +272,8 @@ static int sun4i_hash(struct ahash_request *areq)
*/
while
(
op
->
len
<
64
&&
i
<
end
)
{
/* how many bytes we can read from current SG */
in_r
=
min
3
(
mi
.
length
-
in_i
,
end
-
i
,
64
-
op
->
len
);
in_r
=
min
(
end
-
i
,
64
-
op
->
len
);
in_r
=
min_t
(
size_t
,
mi
.
length
-
in_i
,
in_r
);
memcpy
(
op
->
buf
+
op
->
len
,
mi
.
addr
+
in_i
,
in_r
);
op
->
len
+=
in_r
;
i
+=
in_r
;
...
...
@@ -293,8 +293,8 @@ static int sun4i_hash(struct ahash_request *areq)
}
if
(
mi
.
length
-
in_i
>
3
&&
i
<
end
)
{
/* how many bytes we can read from current SG */
in_r
=
min
3
(
mi
.
length
-
in_i
,
areq
->
nbytes
-
i
,
((
mi
.
length
-
in_i
)
/
4
)
*
4
);
in_r
=
min
_t
(
size_t
,
mi
.
length
-
in_i
,
areq
->
nbytes
-
i
);
in_r
=
min_t
(
size_t
,
((
mi
.
length
-
in_i
)
/
4
)
*
4
,
in_r
);
/* how many bytes we can write in the device*/
todo
=
min3
((
u32
)(
end
-
i
)
/
4
,
rx_cnt
,
(
u32
)
in_r
/
4
);
writesl
(
ss
->
base
+
SS_RXFIFO
,
mi
.
addr
+
in_i
,
todo
);
...
...
@@ -320,8 +320,8 @@ static int sun4i_hash(struct ahash_request *areq)
if
((
areq
->
nbytes
-
i
)
<
64
)
{
while
(
i
<
areq
->
nbytes
&&
in_i
<
mi
.
length
&&
op
->
len
<
64
)
{
/* how many bytes we can read from current SG */
in_r
=
min
3
(
mi
.
length
-
in_i
,
areq
->
nbytes
-
i
,
64
-
op
->
len
);
in_r
=
min
(
areq
->
nbytes
-
i
,
64
-
op
->
len
);
in_r
=
min_t
(
size_t
,
mi
.
length
-
in_i
,
in_r
);
memcpy
(
op
->
buf
+
op
->
len
,
mi
.
addr
+
in_i
,
in_r
);
op
->
len
+=
in_r
;
i
+=
in_r
;
...
...
drivers/crypto/virtio/virtio_crypto_algs.c
View file @
086e5551
...
...
@@ -105,8 +105,6 @@ virtio_crypto_alg_validate_key(int key_len, uint32_t *alg)
*
alg
=
VIRTIO_CRYPTO_CIPHER_AES_CBC
;
break
;
default:
pr_err
(
"virtio_crypto: Unsupported key length: %d
\n
"
,
key_len
);
return
-
EINVAL
;
}
return
0
;
...
...
@@ -484,6 +482,11 @@ static int virtio_crypto_ablkcipher_encrypt(struct ablkcipher_request *req)
/* Use the first data virtqueue as default */
struct
data_queue
*
data_vq
=
&
vcrypto
->
data_vq
[
0
];
if
(
!
req
->
nbytes
)
return
0
;
if
(
req
->
nbytes
%
AES_BLOCK_SIZE
)
return
-
EINVAL
;
vc_req
->
dataq
=
data_vq
;
vc_req
->
alg_cb
=
virtio_crypto_dataq_sym_callback
;
vc_sym_req
->
ablkcipher_ctx
=
ctx
;
...
...
@@ -504,6 +507,11 @@ static int virtio_crypto_ablkcipher_decrypt(struct ablkcipher_request *req)
/* Use the first data virtqueue as default */
struct
data_queue
*
data_vq
=
&
vcrypto
->
data_vq
[
0
];
if
(
!
req
->
nbytes
)
return
0
;
if
(
req
->
nbytes
%
AES_BLOCK_SIZE
)
return
-
EINVAL
;
vc_req
->
dataq
=
data_vq
;
vc_req
->
alg_cb
=
virtio_crypto_dataq_sym_callback
;
vc_sym_req
->
ablkcipher_ctx
=
ctx
;
...
...
drivers/crypto/vmx/Makefile
View file @
086e5551
...
...
@@ -3,13 +3,13 @@ obj-$(CONFIG_CRYPTO_DEV_VMX_ENCRYPT) += vmx-crypto.o
vmx-crypto-objs
:=
vmx.o aesp8-ppc.o ghashp8-ppc.o aes.o aes_cbc.o aes_ctr.o aes_xts.o ghash.o
ifeq
($(CONFIG_CPU_LITTLE_ENDIAN),y)
TARGET
:=
linux-ppc64le
override flavour
:
= linux-ppc64le
else
TARGET
:=
linux-ppc64
override flavour
:
= linux-ppc64
endif
quiet_cmd_perl
=
PERL
$@
cmd_perl
=
$(PERL)
$
(
<
)
$(
TARGET
)
>
$
(
@
)
cmd_perl
=
$(PERL)
$
(
<
)
$(
flavour
)
>
$
(
@
)
targets
+=
aesp8-ppc.S ghashp8-ppc.S
...
...
drivers/dma/fsl-qdma.c
View file @
086e5551
...
...
@@ -1155,6 +1155,9 @@ static int fsl_qdma_probe(struct platform_device *pdev)
return
ret
;
fsl_qdma
->
irq_base
=
platform_get_irq_byname
(
pdev
,
"qdma-queue0"
);
if
(
fsl_qdma
->
irq_base
<
0
)
return
fsl_qdma
->
irq_base
;
fsl_qdma
->
feature
=
of_property_read_bool
(
np
,
"big-endian"
);
INIT_LIST_HEAD
(
&
fsl_qdma
->
dma_dev
.
channels
);
...
...
drivers/dma/xilinx/xilinx_dma.c
View file @
086e5551
...
...
@@ -1433,6 +1433,7 @@ static int xilinx_dma_reset(struct xilinx_dma_chan *chan)
chan
->
err
=
false
;
chan
->
idle
=
true
;
chan
->
desc_pendingcount
=
0
;
chan
->
desc_submitcount
=
0
;
return
err
;
...
...
drivers/edac/amd64_edac.c
View file @
086e5551
...
...
@@ -2936,6 +2936,7 @@ static int init_csrows_df(struct mem_ctl_info *mci)
dimm
->
mtype
=
pvt
->
dram_type
;
dimm
->
edac_mode
=
edac_mode
;
dimm
->
dtype
=
dev_type
;
dimm
->
grain
=
64
;
}
}
...
...
@@ -3012,6 +3013,7 @@ static int init_csrows(struct mem_ctl_info *mci)
dimm
=
csrow
->
channels
[
j
]
->
dimm
;
dimm
->
mtype
=
pvt
->
dram_type
;
dimm
->
edac_mode
=
edac_mode
;
dimm
->
grain
=
64
;
}
}
...
...
drivers/edac/ghes_edac.c
View file @
086e5551
...
...
@@ -231,6 +231,7 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
/* Cleans the error report buffer */
memset
(
e
,
0
,
sizeof
(
*
e
));
e
->
error_count
=
1
;
e
->
grain
=
1
;
strcpy
(
e
->
label
,
"unknown label"
);
e
->
msg
=
pvt
->
msg
;
e
->
other_detail
=
pvt
->
other_detail
;
...
...
@@ -326,7 +327,7 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
/* Error grain */
if
(
mem_err
->
validation_bits
&
CPER_MEM_VALID_PA_MASK
)
e
->
grain
=
~
(
mem_err
->
physical_addr_mask
&
~
PAGE_MASK
)
;
e
->
grain
=
~
mem_err
->
physical_addr_mask
+
1
;
/* Memory error location, mapped on e->location */
p
=
e
->
location
;
...
...
@@ -442,8 +443,13 @@ void ghes_edac_report_mem_error(int sev, struct cper_sec_mem_err *mem_err)
if
(
p
>
pvt
->
other_detail
)
*
(
p
-
1
)
=
'\0'
;
/* Sanity-check driver-supplied grain value. */
if
(
WARN_ON_ONCE
(
!
e
->
grain
))
e
->
grain
=
1
;
grain_bits
=
fls_long
(
e
->
grain
-
1
);
/* Generate the trace event */
grain_bits
=
fls_long
(
e
->
grain
);
snprintf
(
pvt
->
detail_location
,
sizeof
(
pvt
->
detail_location
),
"APEI location: %s %s"
,
e
->
location
,
e
->
other_detail
);
trace_mc_event
(
type
,
e
->
msg
,
e
->
label
,
e
->
error_count
,
...
...
drivers/extcon/extcon-sm5502.c
View file @
086e5551
...
...
@@ -65,6 +65,10 @@ struct sm5502_muic_info {
/* Default value of SM5502 register to bring up MUIC device. */
static
struct
reg_data
sm5502_reg_data
[]
=
{
{
.
reg
=
SM5502_REG_RESET
,
.
val
=
SM5502_REG_RESET_MASK
,
.
invert
=
true
,
},
{
.
reg
=
SM5502_REG_CONTROL
,
.
val
=
SM5502_REG_CONTROL_MASK_INT_MASK
,
.
invert
=
false
,
...
...
drivers/extcon/extcon-sm5502.h
View file @
086e5551
...
...
@@ -237,6 +237,8 @@ enum sm5502_reg {
#define DM_DP_SWITCH_UART ((DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DP_SHIFT) \
| (DM_DP_CON_SWITCH_UART <<SM5502_REG_MANUAL_SW1_DM_SHIFT))
#define SM5502_REG_RESET_MASK (0x1)
/* SM5502 Interrupts */
enum
sm5502_irq
{
/* INT1 */
...
...
drivers/firmware/efi/efi.c
View file @
086e5551
...
...
@@ -970,6 +970,24 @@ static int __init efi_memreserve_map_root(void)
return
0
;
}
static
int
efi_mem_reserve_iomem
(
phys_addr_t
addr
,
u64
size
)
{
struct
resource
*
res
,
*
parent
;
res
=
kzalloc
(
sizeof
(
struct
resource
),
GFP_ATOMIC
);
if
(
!
res
)
return
-
ENOMEM
;
res
->
name
=
"reserved"
;
res
->
flags
=
IORESOURCE_MEM
;
res
->
start
=
addr
;
res
->
end
=
addr
+
size
-
1
;
/* we expect a conflict with a 'System RAM' region */
parent
=
request_resource_conflict
(
&
iomem_resource
,
res
);
return
parent
?
request_resource
(
parent
,
res
)
:
0
;
}
int
__ref
efi_mem_reserve_persistent
(
phys_addr_t
addr
,
u64
size
)
{
struct
linux_efi_memreserve
*
rsv
;
...
...
@@ -994,7 +1012,7 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
rsv
->
entry
[
index
].
size
=
size
;
memunmap
(
rsv
);
return
0
;
return
efi_mem_reserve_iomem
(
addr
,
size
)
;
}
memunmap
(
rsv
);
}
...
...
@@ -1004,6 +1022,12 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
if
(
!
rsv
)
return
-
ENOMEM
;
rc
=
efi_mem_reserve_iomem
(
__pa
(
rsv
),
SZ_4K
);
if
(
rc
)
{
free_page
((
unsigned
long
)
rsv
);
return
rc
;
}
/*
* The memremap() call above assumes that a linux_efi_memreserve entry
* never crosses a page boundary, so let's ensure that this remains true
...
...
@@ -1020,7 +1044,7 @@ int __ref efi_mem_reserve_persistent(phys_addr_t addr, u64 size)
efi_memreserve_root
->
next
=
__pa
(
rsv
);
spin_unlock
(
&
efi_mem_reserve_persistent_lock
);
return
0
;
return
efi_mem_reserve_iomem
(
addr
,
size
)
;
}
static
int
__init
efi_memreserve_root_init
(
void
)
...
...
drivers/fsi/fsi-core.c
View file @
086e5551
...
...
@@ -544,6 +544,31 @@ static int fsi_slave_scan(struct fsi_slave *slave)
return
0
;
}
static
unsigned
long
aligned_access_size
(
size_t
offset
,
size_t
count
)
{
unsigned
long
offset_unit
,
count_unit
;
/* Criteria:
*
* 1. Access size must be less than or equal to the maximum access
* width or the highest power-of-two factor of offset
* 2. Access size must be less than or equal to the amount specified by
* count
*
* The access width is optimal if we can calculate 1 to be strictly
* equal while still satisfying 2.
*/
/* Find 1 by the bottom bit of offset (with a 4 byte access cap) */
offset_unit
=
BIT
(
__builtin_ctzl
(
offset
|
4
));
/* Find 2 by the top bit of count */
count_unit
=
BIT
(
8
*
sizeof
(
unsigned
long
)
-
1
-
__builtin_clzl
(
count
));
/* Constrain the maximum access width to the minimum of both criteria */
return
BIT
(
__builtin_ctzl
(
offset_unit
|
count_unit
));
}
static
ssize_t
fsi_slave_sysfs_raw_read
(
struct
file
*
file
,
struct
kobject
*
kobj
,
struct
bin_attribute
*
attr
,
char
*
buf
,
loff_t
off
,
size_t
count
)
...
...
@@ -559,8 +584,7 @@ static ssize_t fsi_slave_sysfs_raw_read(struct file *file,
return
-
EINVAL
;
for
(
total_len
=
0
;
total_len
<
count
;
total_len
+=
read_len
)
{
read_len
=
min_t
(
size_t
,
count
,
4
);
read_len
-=
off
&
0x3
;
read_len
=
aligned_access_size
(
off
,
count
-
total_len
);
rc
=
fsi_slave_read
(
slave
,
off
,
buf
+
total_len
,
read_len
);
if
(
rc
)
...
...
@@ -587,8 +611,7 @@ static ssize_t fsi_slave_sysfs_raw_write(struct file *file,
return
-
EINVAL
;
for
(
total_len
=
0
;
total_len
<
count
;
total_len
+=
write_len
)
{
write_len
=
min_t
(
size_t
,
count
,
4
);
write_len
-=
off
&
0x3
;
write_len
=
aligned_access_size
(
off
,
count
-
total_len
);
rc
=
fsi_slave_write
(
slave
,
off
,
buf
+
total_len
,
write_len
);
if
(
rc
)
...
...
drivers/gpio/gpio-lynxpoint.c
View file @
086e5551
...
...
@@ -164,6 +164,12 @@ static int lp_irq_type(struct irq_data *d, unsigned type)
value
|=
TRIG_SEL_BIT
|
INT_INV_BIT
;
outl
(
value
,
reg
);
if
(
type
&
IRQ_TYPE_EDGE_BOTH
)
irq_set_handler_locked
(
d
,
handle_edge_irq
);
else
if
(
type
&
IRQ_TYPE_LEVEL_MASK
)
irq_set_handler_locked
(
d
,
handle_level_irq
);
spin_unlock_irqrestore
(
&
lg
->
lock
,
flags
);
return
0
;
...
...
Prev
1
2
3
4
5
6
7
8
9
…
32
Next
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment