mirror of
https://github.com/torvalds/linux.git
synced 2026-05-22 06:01:53 +02:00
Samsung SoC driver fixes for v6.15
1. Exynos ACPM driver (used on Google GS101): Fix timeout due to missing
responses from the firmware part.
2. Samsung USI (serial engines) driver: Correct ineffective
unconfiguring of the interface during probe removal.
-----BEGIN PGP SIGNATURE-----
iQJEBAABCgAuFiEE3dJiKD0RGyM7briowTdm5oaLg9cFAmgjGfUQHGtyemtAa2Vy
bmVsLm9yZwAKCRDBN2bmhouD14NGD/oC9CelppV3M+ISqAb+o5XjyoTTgNTcsp4Q
Dvpv/x4OWwatTAGuCn775dCAFW+MvkQC3w5/m7wJo+SiIYhB+3JFzdaFm/BrkPFJ
yEsrKEvXuAUoV1NPLpHr6FT/IVaYuJtBQR8kYYRQCQYmlBnxSyZEP9O1nBMl8LyT
uU7LmdsLSzGGx1dfvPdJBffmDQyUtrYdK7Gq73GN6mDxbJgSTiDaflLf9nJiaeAq
A2P1N/lDmLoF/Tqs6LRJHxEc4VXTrP1mAytHUTsignpsrdvrvYAnU2mhMp/4Fa9P
Ecbh2dwfKAP7+vFjdbeNV7yeS/gd4dhWwb+iGH7de4iUU4PUK6nQ/eH8h6fJKJOH
K8OaWWiVUkvwDktSl5tkRswdGYKNoCgn9B8f6YhqjmhOkNdluaSxVPjuD6ZCmw3u
8ICRyubNAx1ExIG4wXzdsIcVUHHqtwT3cQDyORJbwgGQvSzJ+iALNvUpXE+ZhyIU
zZ9uTKfm61bBbD3nXwVcXktK4HdC+4o6DUSgQfKrl/P6V2FpDqeVR4b93SFN4qDO
OzVVC1AhdHFcQO+qRzJ+Yv9T700AmzwkUTELDNygg6qLiLUs9QCpHC4wpW74hf3Z
sdhSs1mT9jLa0jsWSbp3JF8LOERyXdNa+5X8c40QG1UcKWU+cg1QGMivSIBU9oCz
CeZzLb5l1Q==
=k9cZ
-----END PGP SIGNATURE-----
gpgsig -----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEo6/YBQwIrVS28WGKmmx57+YAGNkFAmguBygACgkQmmx57+YA
GNmsKhAAmRvMpJdhwP3JzTvA+F44c3Ib10daRcinGzYqZMxSdWOQqcCbtfM8q1LI
UMOd1z2SacjEPIaavBQaX9+8YYjRtMgfG1rCSA9/Z+7BXE48E4o3f6rHtDcppE0N
5i1bL00oO+wMDM9u7ocvSAPVxuIWykqa5gee5tUE+6bBklYai2U/zvyBXYEzo9iQ
KRyqyO/rVUhDCekEPvXi7UZOKBFdVYfdsfBSKLVMrxJnpLIqdeKtypAOtVnNfqWX
uUDgKDIRUGm5H/4z4qO+R+K4bC/tJCTKMIFct6GSyqYd5paJeFU8u57swy9Dqh+u
c6QTPl3LIegAr9OClqQDwotMeJP7hpSIUeIlfZDTljRi9gWJk/pvgccqVYAieaxe
iJ3Vl1TSi+ikb1nA56oybJnoIP2l0uKI0w8Cog5MwtyaYyCAObtfkuAclQwQGKxL
9j3qDbv834MXs3z9beRIn91CHzeVjP666il3wrpfdEUI5Ap9cbkrQm4AbQWUrH2g
DOQL4dtl8PRGB7pLI8PHqxo94KkxWrntaJYD6mqFwkAsMQbEtI3IZ7TJXcXioq1g
0gD+8lltlkBDBm+PHz0G74HuPlD/78wQU743n/Vh8AZ5vh/3PnLYEOBfk0KgF++Y
jdcQNMv6Kn0QqvwUQa+TGDKkXHbsk3cY2wBXboC6ZEvuqtVszX0=
=/aFj
-----END PGP SIGNATURE-----
Merge tag 'samsung-fixes-6.15' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux into arm/fixes
Samsung SoC driver fixes for v6.15
1. Exynos ACPM driver (used on Google GS101): Fix timeout due to missing
responses from the firmware part.
2. Samsung USI (serial engines) driver: Correct ineffective
unconfiguring of the interface during probe removal.
* tag 'samsung-fixes-6.15' of https://git.kernel.org/pub/scm/linux/kernel/git/krzk/linux:
soc: samsung: usi: prevent wrong bits inversion during unconfiguring
firmware: exynos-acpm: check saved RX before bailing out on empty RX queue
Link: https://lore.kernel.org/r/20250513101023.21552-5-krzysztof.kozlowski@linaro.org
Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
commit
7c1bda0993
|
|
@ -184,6 +184,29 @@ struct acpm_match_data {
|
|||
#define client_to_acpm_chan(c) container_of(c, struct acpm_chan, cl)
|
||||
#define handle_to_acpm_info(h) container_of(h, struct acpm_info, handle)
|
||||
|
||||
/**
|
||||
* acpm_get_saved_rx() - get the response if it was already saved.
|
||||
* @achan: ACPM channel info.
|
||||
* @xfer: reference to the transfer to get response for.
|
||||
* @tx_seqnum: xfer TX sequence number.
|
||||
*/
|
||||
static void acpm_get_saved_rx(struct acpm_chan *achan,
|
||||
const struct acpm_xfer *xfer, u32 tx_seqnum)
|
||||
{
|
||||
const struct acpm_rx_data *rx_data = &achan->rx_data[tx_seqnum - 1];
|
||||
u32 rx_seqnum;
|
||||
|
||||
if (!rx_data->response)
|
||||
return;
|
||||
|
||||
rx_seqnum = FIELD_GET(ACPM_PROTOCOL_SEQNUM, rx_data->cmd[0]);
|
||||
|
||||
if (rx_seqnum == tx_seqnum) {
|
||||
memcpy(xfer->rxd, rx_data->cmd, xfer->rxlen);
|
||||
clear_bit(rx_seqnum - 1, achan->bitmap_seqnum);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* acpm_get_rx() - get response from RX queue.
|
||||
* @achan: ACPM channel info.
|
||||
|
|
@ -204,15 +227,16 @@ static int acpm_get_rx(struct acpm_chan *achan, const struct acpm_xfer *xfer)
|
|||
rx_front = readl(achan->rx.front);
|
||||
i = readl(achan->rx.rear);
|
||||
|
||||
/* Bail out if RX is empty. */
|
||||
if (i == rx_front)
|
||||
tx_seqnum = FIELD_GET(ACPM_PROTOCOL_SEQNUM, xfer->txd[0]);
|
||||
|
||||
if (i == rx_front) {
|
||||
acpm_get_saved_rx(achan, xfer, tx_seqnum);
|
||||
return 0;
|
||||
}
|
||||
|
||||
base = achan->rx.base;
|
||||
mlen = achan->mlen;
|
||||
|
||||
tx_seqnum = FIELD_GET(ACPM_PROTOCOL_SEQNUM, xfer->txd[0]);
|
||||
|
||||
/* Drain RX queue. */
|
||||
do {
|
||||
/* Read RX seqnum. */
|
||||
|
|
@ -259,16 +283,8 @@ static int acpm_get_rx(struct acpm_chan *achan, const struct acpm_xfer *xfer)
|
|||
* If the response was not in this iteration of the queue, check if the
|
||||
* RX data was previously saved.
|
||||
*/
|
||||
rx_data = &achan->rx_data[tx_seqnum - 1];
|
||||
if (!rx_set && rx_data->response) {
|
||||
rx_seqnum = FIELD_GET(ACPM_PROTOCOL_SEQNUM,
|
||||
rx_data->cmd[0]);
|
||||
|
||||
if (rx_seqnum == tx_seqnum) {
|
||||
memcpy(xfer->rxd, rx_data->cmd, xfer->rxlen);
|
||||
clear_bit(rx_seqnum - 1, achan->bitmap_seqnum);
|
||||
}
|
||||
}
|
||||
if (!rx_set)
|
||||
acpm_get_saved_rx(achan, xfer, tx_seqnum);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -233,7 +233,7 @@ static void exynos_usi_unconfigure(void *data)
|
|||
/* Make sure that we've stopped providing the clock to USI IP */
|
||||
val = readl(usi->regs + USI_OPTION);
|
||||
val &= ~USI_OPTION_CLKREQ_ON;
|
||||
val |= ~USI_OPTION_CLKSTOP_ON;
|
||||
val |= USI_OPTION_CLKSTOP_ON;
|
||||
writel(val, usi->regs + USI_OPTION);
|
||||
|
||||
/* Set USI block state to reset */
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user