main/linux-postmarketos-stericsson: upgrade to 5.15-rc1 (MR 2522)
This commit is contained in:
parent
e438c1acba
commit
a7d1a3ed35
5 changed files with 103 additions and 340 deletions
|
@ -4,9 +4,9 @@
|
|||
_flavor="postmarketos-stericsson"
|
||||
_config="config-$_flavor.armv7"
|
||||
pkgname=linux-$_flavor
|
||||
pkgver=5.14_rc2
|
||||
pkgrel=2
|
||||
_tag="5.14-rc2"
|
||||
pkgver=5.15_rc1
|
||||
pkgrel=0
|
||||
_tag="5.15-rc1"
|
||||
pkgdesc="Mainline kernel fork for ST-Ericsson NovaThor devices"
|
||||
arch="armv7"
|
||||
_carch="arm"
|
||||
|
@ -22,9 +22,7 @@ makedepends="bison findutils gmp-dev flex installkernel mpc1-dev mpfr-dev openss
|
|||
source="
|
||||
$pkgname-$_tag.tar.gz::https://git.kernel.org/torvalds/t/linux-$_tag.tar.gz
|
||||
config-$_flavor.armv7
|
||||
bl.patch
|
||||
emmc.patch
|
||||
firmware.patch
|
||||
regulators.patch
|
||||
"
|
||||
builddir="$srcdir/linux-${_tag#v}"
|
||||
|
@ -54,10 +52,8 @@ package() {
|
|||
}
|
||||
|
||||
sha512sums="
|
||||
f12cb96635631a15e806dc1488e69344ec4da62fae10866be070e915f0ba359520b0564f09bc425e588f1d6f484d337b15f1699b492d10e5d4f4908b54c93bbe linux-postmarketos-stericsson-5.14-rc2.tar.gz
|
||||
7167bb4902f0872ceb6966513511e40af7125783f82f6eb3d9807b4ab7cf0ae91d0ae943c4123f9567a76ce2852876a5e38c7350767d6552b1de8d0ce618b0d7 config-postmarketos-stericsson.armv7
|
||||
66ec2d3105540e991bccc8cfb0e4212cb40a31a5a35e8cdc084b8bd7ffa016a86b3b340fd57b077b3c95b5bcb1e80cadaa11e71cd1a54a3e0e595024f3f27346 bl.patch
|
||||
760afb46cf56a97b9a9a61fabd5c686c7b98bd64864774516099ad57a7c34d146a16d7ce4687b6071c3fd2df307e7f184428924569e0e767f3c80b780720d85b emmc.patch
|
||||
8c12e75094fde3fe50318cc478afdb2ed304ad682172e30b64ac27d536d8ccba2b6a364e62b4028e9c9ea7863e43f36dc6e3d466b29199d260d86a5995d224a1 firmware.patch
|
||||
3f7303ed8387b9f0298d32c28ae17a48ccbab2232fb278868c76dbd3d8f2911cb25b725a4e79c77f1c0f7939bd6fde946ddf68ee5ace3cd9d1076470e6238109 linux-postmarketos-stericsson-5.15-rc1.tar.gz
|
||||
cdc5c71df0e8db84f78789b7a5f4e84b09e4018ab89e9f0f760832ed75e0aedb8c5f6a1d11b6e3429e66b5d6bd41ef9d02a118c71feac06c953552ee910d591a config-postmarketos-stericsson.armv7
|
||||
d1bd4c1f04e67ab33f03285f8baf1187d4dde29b9c49711c56f31d4708296172295ea1ad153504f2a4e944ad3d80ddc12a7218dc0d79161089ed527fc4404632 emmc.patch
|
||||
8206d74c52328827502a32644f70fd149a72a78aaf936cd44f474b9153e8caccf73206df76e24004329edebab90e1a4a0e965630f4817aa5dd642d9ee2729295 regulators.patch
|
||||
"
|
||||
|
|
|
@ -1,151 +0,0 @@
|
|||
Remove interrupt disablement during backlight setting. It is
|
||||
way to dangerous and makes platforms instable by having it
|
||||
miss vblank IRQs leading to the graphics derailing.
|
||||
|
||||
The code is using ndelay() which is not available on
|
||||
platforms such as ARM and will result in 32 * udelay(1)
|
||||
which is substantial.
|
||||
|
||||
Add some code to detect if an interrupt occurs during the
|
||||
tight loop and in that case just redo it from the top.
|
||||
|
||||
Fixes: 5317f37e48b9 ("backlight: Add Kinetic KTD253 backlight driver")
|
||||
Cc: Stephan Gerhold <stephan@gerhold.net>
|
||||
Reported-by: newbyte@disroot.org
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
---
|
||||
ChangeLog v2->v3:
|
||||
- Read my own patch and realized a bug: when we get a timeout
|
||||
we bounce back to max period, but still count down the pwm
|
||||
with one leading to an off-by-one error. Fix it by extending
|
||||
some else clauses.
|
||||
ChangeLog v1->v2:
|
||||
- Alter the dimming code to check for how many ns the pulse
|
||||
is low, and if it gets to ~100 us then redo from start.
|
||||
This is to account for the advent that an IRQ arrives while
|
||||
setting backlight and hits the low pulse making it way
|
||||
too long.
|
||||
---
|
||||
drivers/video/backlight/ktd253-backlight.c | 75 ++++++++++++++++------
|
||||
1 file changed, 55 insertions(+), 20 deletions(-)
|
||||
|
||||
diff --git a/drivers/video/backlight/ktd253-backlight.c b/drivers/video/backlight/ktd253-backlight.c
|
||||
index a7df5bcca9da..37aa5a669530 100644
|
||||
--- a/drivers/video/backlight/ktd253-backlight.c
|
||||
+++ b/drivers/video/backlight/ktd253-backlight.c
|
||||
@@ -25,6 +25,7 @@
|
||||
|
||||
#define KTD253_T_LOW_NS (200 + 10) /* Additional 10ns as safety factor */
|
||||
#define KTD253_T_HIGH_NS (200 + 10) /* Additional 10ns as safety factor */
|
||||
+#define KTD253_T_OFF_CRIT_NS 100000 /* 100 us, now it doesn't look good */
|
||||
#define KTD253_T_OFF_MS 3
|
||||
|
||||
struct ktd253_backlight {
|
||||
@@ -34,13 +35,50 @@ struct ktd253_backlight {
|
||||
u16 ratio;
|
||||
};
|
||||
|
||||
+static void ktd253_backlight_set_max_ratio(struct ktd253_backlight *ktd253)
|
||||
+{
|
||||
+ gpiod_set_value_cansleep(ktd253->gpiod, 1);
|
||||
+ ndelay(KTD253_T_HIGH_NS);
|
||||
+ /* We always fall back to this when we power on */
|
||||
+}
|
||||
+
|
||||
+static int ktd253_backlight_stepdown(struct ktd253_backlight *ktd253)
|
||||
+{
|
||||
+ /*
|
||||
+ * These GPIO operations absolutely can NOT sleep so no _cansleep
|
||||
+ * suffixes, and no using GPIO expanders on slow buses for this!
|
||||
+ *
|
||||
+ * The maximum number of cycles of the loop is 32 so the time taken
|
||||
+ * should nominally be:
|
||||
+ * (T_LOW_NS + T_HIGH_NS + loop_time) * 32
|
||||
+ *
|
||||
+ * Architectures do not always support ndelay() and we will get a few us
|
||||
+ * instead. If we get to a critical time limit an interrupt has likely
|
||||
+ * occured in the low part of the loop and we need to restart from the
|
||||
+ * top so we have the backlight in a known state.
|
||||
+ */
|
||||
+ u64 ns;
|
||||
+
|
||||
+ ns = ktime_get_ns();
|
||||
+ gpiod_set_value(ktd253->gpiod, 0);
|
||||
+ ndelay(KTD253_T_LOW_NS);
|
||||
+ gpiod_set_value(ktd253->gpiod, 1);
|
||||
+ ns = ktime_get_ns() - ns;
|
||||
+ if (ns >= KTD253_T_OFF_CRIT_NS) {
|
||||
+ dev_err(ktd253->dev, "PCM on backlight took too long (%llu ns)\n", ns);
|
||||
+ return -EAGAIN;
|
||||
+ }
|
||||
+ ndelay(KTD253_T_HIGH_NS);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
static int ktd253_backlight_update_status(struct backlight_device *bl)
|
||||
{
|
||||
struct ktd253_backlight *ktd253 = bl_get_data(bl);
|
||||
int brightness = backlight_get_brightness(bl);
|
||||
u16 target_ratio;
|
||||
u16 current_ratio = ktd253->ratio;
|
||||
- unsigned long flags;
|
||||
+ int ret;
|
||||
|
||||
dev_dbg(ktd253->dev, "new brightness/ratio: %d/32\n", brightness);
|
||||
|
||||
@@ -62,37 +100,34 @@ static int ktd253_backlight_update_status(struct backlight_device *bl)
|
||||
}
|
||||
|
||||
if (current_ratio == 0) {
|
||||
- gpiod_set_value_cansleep(ktd253->gpiod, 1);
|
||||
- ndelay(KTD253_T_HIGH_NS);
|
||||
- /* We always fall back to this when we power on */
|
||||
+ ktd253_backlight_set_max_ratio(ktd253);
|
||||
current_ratio = KTD253_MAX_RATIO;
|
||||
}
|
||||
|
||||
- /*
|
||||
- * WARNING:
|
||||
- * The loop to set the correct current level is performed
|
||||
- * with interrupts disabled as it is timing critical.
|
||||
- * The maximum number of cycles of the loop is 32
|
||||
- * so the time taken will be (T_LOW_NS + T_HIGH_NS + loop_time) * 32,
|
||||
- */
|
||||
- local_irq_save(flags);
|
||||
while (current_ratio != target_ratio) {
|
||||
/*
|
||||
* These GPIO operations absolutely can NOT sleep so no
|
||||
* _cansleep suffixes, and no using GPIO expanders on
|
||||
* slow buses for this!
|
||||
*/
|
||||
- gpiod_set_value(ktd253->gpiod, 0);
|
||||
- ndelay(KTD253_T_LOW_NS);
|
||||
- gpiod_set_value(ktd253->gpiod, 1);
|
||||
- ndelay(KTD253_T_HIGH_NS);
|
||||
- /* After 1/32 we loop back to 32/32 */
|
||||
- if (current_ratio == KTD253_MIN_RATIO)
|
||||
+ ret = ktd253_backlight_stepdown(ktd253);
|
||||
+ if (ret == -EAGAIN) {
|
||||
+ /*
|
||||
+ * Something disturbed the backlight setting code when
|
||||
+ * running so we need to bring the PWM back to a known
|
||||
+ * state. This shouldn't happen too much.
|
||||
+ */
|
||||
+ gpiod_set_value_cansleep(ktd253->gpiod, 0);
|
||||
+ msleep(KTD253_T_OFF_MS);
|
||||
+ ktd253_backlight_set_max_ratio(ktd253);
|
||||
+ current_ratio = KTD253_MAX_RATIO;
|
||||
+ } else if (current_ratio == KTD253_MIN_RATIO) {
|
||||
+ /* After 1/32 we loop back to 32/32 */
|
||||
current_ratio = KTD253_MAX_RATIO;
|
||||
- else
|
||||
+ } else {
|
||||
current_ratio--;
|
||||
+ }
|
||||
}
|
||||
- local_irq_restore(flags);
|
||||
ktd253->ratio = current_ratio;
|
||||
|
||||
dev_dbg(ktd253->dev, "new ratio set to %d/32\n", target_ratio);
|
||||
--
|
||||
2.31.1
|
|
@ -1,6 +1,6 @@
|
|||
#
|
||||
# Automatically generated file; DO NOT EDIT.
|
||||
# Linux/arm 5.14.0-rc2 Kernel Configuration
|
||||
# Linux/arm 5.15.0-rc1 Kernel Configuration
|
||||
#
|
||||
CONFIG_CC_VERSION_TEXT="armv7-alpine-linux-musleabihf-gcc (Alpine 10.3.1_git20210625) 10.3.1 20210625"
|
||||
CONFIG_CC_IS_GCC=y
|
||||
|
@ -22,6 +22,7 @@ CONFIG_BUILDTIME_TABLE_SORT=y
|
|||
#
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
# CONFIG_COMPILE_TEST is not set
|
||||
# CONFIG_WERROR is not set
|
||||
CONFIG_LOCALVERSION="-postmarketos-stericsson"
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_BUILD_SALT=""
|
||||
|
@ -126,6 +127,7 @@ CONFIG_RCU_NEED_SEGCBLIST=y
|
|||
CONFIG_LOG_BUF_SHIFT=17
|
||||
CONFIG_LOG_CPU_MAX_BUF_SHIFT=12
|
||||
CONFIG_PRINTK_SAFE_LOG_BUF_SHIFT=13
|
||||
# CONFIG_PRINTK_INDEX is not set
|
||||
CONFIG_GENERIC_SCHED_CLOCK=y
|
||||
|
||||
#
|
||||
|
@ -178,7 +180,6 @@ CONFIG_SYSFS_SYSCALL=y
|
|||
CONFIG_FHANDLE=y
|
||||
CONFIG_POSIX_TIMERS=y
|
||||
CONFIG_PRINTK=y
|
||||
CONFIG_PRINTK_NMI=y
|
||||
CONFIG_BUG=y
|
||||
CONFIG_ELF_CORE=y
|
||||
CONFIG_BASE_FULL=y
|
||||
|
@ -231,7 +232,6 @@ CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
|||
CONFIG_HAVE_PROC_CPU=y
|
||||
CONFIG_STACKTRACE_SUPPORT=y
|
||||
CONFIG_LOCKDEP_SUPPORT=y
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
CONFIG_FIX_EARLYCON_MEM=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
|
@ -537,7 +537,15 @@ CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
|||
#
|
||||
# Firmware Drivers
|
||||
#
|
||||
|
||||
#
|
||||
# ARM System Control and Management Interface Protocol
|
||||
#
|
||||
# CONFIG_ARM_SCMI_PROTOCOL is not set
|
||||
# end of ARM System Control and Management Interface Protocol
|
||||
|
||||
# CONFIG_FW_CFG_SYSFS is not set
|
||||
# CONFIG_QCOM_SCM is not set
|
||||
# CONFIG_TRUSTED_FOUNDATIONS is not set
|
||||
# CONFIG_GOOGLE_FIRMWARE is not set
|
||||
CONFIG_HAVE_ARM_SMCCC=y
|
||||
|
@ -554,7 +562,6 @@ CONFIG_AS_VFP_VMRS_FPINST=y
|
|||
#
|
||||
# General architecture-dependent options
|
||||
#
|
||||
CONFIG_SET_FS=y
|
||||
# CONFIG_KPROBES is not set
|
||||
# CONFIG_JUMP_LABEL is not set
|
||||
CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS=y
|
||||
|
@ -563,6 +570,7 @@ CONFIG_HAVE_KPROBES=y
|
|||
CONFIG_HAVE_KRETPROBES=y
|
||||
CONFIG_HAVE_OPTPROBES=y
|
||||
CONFIG_HAVE_NMI=y
|
||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||
CONFIG_HAVE_ARCH_TRACEHOOK=y
|
||||
CONFIG_HAVE_DMA_CONTIGUOUS=y
|
||||
CONFIG_GENERIC_SMP_IDLE_THREAD=y
|
||||
|
@ -645,11 +653,9 @@ CONFIG_MODULE_COMPRESS_NONE=y
|
|||
CONFIG_MODPROBE_PATH="/sbin/modprobe"
|
||||
CONFIG_MODULES_TREE_LOOKUP=y
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_BSGLIB is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
# CONFIG_BLK_DEV_ZONED is not set
|
||||
# CONFIG_BLK_CMDLINE_PARSER is not set
|
||||
# CONFIG_BLK_WBT is not set
|
||||
CONFIG_BLK_DEBUG_FS=y
|
||||
# CONFIG_BLK_SED_OPAL is not set
|
||||
|
@ -681,6 +687,7 @@ CONFIG_EFI_PARTITION=y
|
|||
# end of Partition Types
|
||||
|
||||
CONFIG_BLK_PM=y
|
||||
CONFIG_BLOCK_HOLDER_DEPRECATED=y
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
|
@ -750,6 +757,12 @@ CONFIG_GENERIC_EARLY_IOREMAP=y
|
|||
# CONFIG_PERCPU_STATS is not set
|
||||
# CONFIG_GUP_TEST is not set
|
||||
CONFIG_KMAP_LOCAL=y
|
||||
|
||||
#
|
||||
# Data Access Monitoring
|
||||
#
|
||||
# CONFIG_DAMON is not set
|
||||
# end of Data Access Monitoring
|
||||
# end of Memory Management options
|
||||
|
||||
CONFIG_NET=y
|
||||
|
@ -762,6 +775,7 @@ CONFIG_PACKET=y
|
|||
# CONFIG_PACKET_DIAG is not set
|
||||
CONFIG_UNIX=y
|
||||
CONFIG_UNIX_SCM=y
|
||||
CONFIG_AF_UNIX_OOB=y
|
||||
# CONFIG_UNIX_DIAG is not set
|
||||
# CONFIG_TLS is not set
|
||||
# CONFIG_XFRM_USER is not set
|
||||
|
@ -811,6 +825,7 @@ CONFIG_IPV6_NDISC_NODETYPE=y
|
|||
# CONFIG_IPV6_SEG6_LWTUNNEL is not set
|
||||
# CONFIG_IPV6_SEG6_HMAC is not set
|
||||
# CONFIG_IPV6_RPL_LWTUNNEL is not set
|
||||
# CONFIG_IPV6_IOAM6_LWTUNNEL is not set
|
||||
# CONFIG_MPTCP is not set
|
||||
# CONFIG_NETWORK_SECMARK is not set
|
||||
# CONFIG_NETWORK_PHY_TIMESTAMPING is not set
|
||||
|
@ -1113,6 +1128,7 @@ CONFIG_BT_HCIUART_BCM=y
|
|||
|
||||
# CONFIG_AF_RXRPC is not set
|
||||
# CONFIG_AF_KCM is not set
|
||||
# CONFIG_MCTP is not set
|
||||
CONFIG_WIRELESS=y
|
||||
CONFIG_CFG80211=y
|
||||
# CONFIG_NL80211_TESTMODE is not set
|
||||
|
@ -1320,7 +1336,6 @@ CONFIG_DM_CRYPT=y
|
|||
# CONFIG_DM_THIN_PROVISIONING is not set
|
||||
# CONFIG_DM_CACHE is not set
|
||||
# CONFIG_DM_WRITECACHE is not set
|
||||
# CONFIG_DM_EBS is not set
|
||||
# CONFIG_DM_ERA is not set
|
||||
# CONFIG_DM_CLONE is not set
|
||||
# CONFIG_DM_MIRROR is not set
|
||||
|
@ -1372,7 +1387,7 @@ CONFIG_NET_VENDOR_CADENCE=y
|
|||
# CONFIG_MACB is not set
|
||||
CONFIG_NET_VENDOR_CAVIUM=y
|
||||
CONFIG_NET_VENDOR_CIRRUS=y
|
||||
# CONFIG_CS89x0 is not set
|
||||
# CONFIG_CS89x0_PLATFORM is not set
|
||||
CONFIG_NET_VENDOR_CORTINA=y
|
||||
# CONFIG_GEMINI_ETHERNET is not set
|
||||
# CONFIG_DM9000 is not set
|
||||
|
@ -1393,6 +1408,8 @@ CONFIG_NET_VENDOR_HUAWEI=y
|
|||
CONFIG_NET_VENDOR_I825XX=y
|
||||
CONFIG_NET_VENDOR_INTEL=y
|
||||
CONFIG_NET_VENDOR_MICROSOFT=y
|
||||
CONFIG_NET_VENDOR_LITEX=y
|
||||
# CONFIG_LITEX_LITEETH is not set
|
||||
CONFIG_NET_VENDOR_MARVELL=y
|
||||
# CONFIG_MVMDIO is not set
|
||||
CONFIG_NET_VENDOR_MELLANOX=y
|
||||
|
@ -1470,6 +1487,7 @@ CONFIG_FIXED_PHY=y
|
|||
# CONFIG_MARVELL_PHY is not set
|
||||
# CONFIG_MARVELL_10G_PHY is not set
|
||||
# CONFIG_MARVELL_88X2222_PHY is not set
|
||||
# CONFIG_MAXLINEAR_GPHY is not set
|
||||
# CONFIG_MEDIATEK_GE_PHY is not set
|
||||
# CONFIG_MICREL_PHY is not set
|
||||
# CONFIG_MICROCHIP_PHY is not set
|
||||
|
@ -1589,7 +1607,6 @@ CONFIG_WLAN_VENDOR_QUANTENNA=y
|
|||
# CONFIG_NETDEVSIM is not set
|
||||
# CONFIG_NET_FAILOVER is not set
|
||||
# CONFIG_ISDN is not set
|
||||
# CONFIG_NVM is not set
|
||||
|
||||
#
|
||||
# Input device support
|
||||
|
@ -1830,9 +1847,8 @@ CONFIG_HW_RANDOM=y
|
|||
CONFIG_DEVMEM=y
|
||||
# CONFIG_TCG_TPM is not set
|
||||
# CONFIG_XILLYBUS is not set
|
||||
# end of Character devices
|
||||
|
||||
# CONFIG_RANDOM_TRUST_BOOTLOADER is not set
|
||||
# end of Character devices
|
||||
|
||||
#
|
||||
# I2C support
|
||||
|
@ -1888,6 +1904,7 @@ CONFIG_I2C_NOMADIK=y
|
|||
#
|
||||
# Other I2C/SMBus bus drivers
|
||||
#
|
||||
# CONFIG_I2C_VIRTIO is not set
|
||||
# end of I2C Hardware Bus support
|
||||
|
||||
# CONFIG_I2C_STUB is not set
|
||||
|
@ -1946,6 +1963,7 @@ CONFIG_SPI_PL022=y
|
|||
# PTP clock support
|
||||
#
|
||||
# CONFIG_PTP_1588_CLOCK is not set
|
||||
CONFIG_PTP_1588_CLOCK_OPTIONAL=y
|
||||
|
||||
#
|
||||
# Enable PHYLIB and NETWORK_PHY_TIMESTAMPING to see the additional clocks.
|
||||
|
@ -2194,6 +2212,7 @@ CONFIG_SENSORS_NTC_THERMISTOR=y
|
|||
# CONFIG_SENSORS_PCF8591 is not set
|
||||
# CONFIG_PMBUS is not set
|
||||
# CONFIG_SENSORS_SBTSI is not set
|
||||
# CONFIG_SENSORS_SBRMI is not set
|
||||
# CONFIG_SENSORS_SHT15 is not set
|
||||
# CONFIG_SENSORS_SHT21 is not set
|
||||
# CONFIG_SENSORS_SHT3x is not set
|
||||
|
@ -2412,6 +2431,8 @@ CONFIG_MFD_TC3589X=y
|
|||
# CONFIG_MFD_QCOM_PM8008 is not set
|
||||
# CONFIG_RAVE_SP_CORE is not set
|
||||
# CONFIG_MFD_INTEL_M10_BMC is not set
|
||||
# CONFIG_MFD_RSMU_I2C is not set
|
||||
# CONFIG_MFD_RSMU_SPI is not set
|
||||
# end of Multifunction device drivers
|
||||
|
||||
CONFIG_REGULATOR=y
|
||||
|
@ -2462,7 +2483,9 @@ CONFIG_REGULATOR_GPIO=y
|
|||
# CONFIG_REGULATOR_RT4801 is not set
|
||||
# CONFIG_REGULATOR_RT6160 is not set
|
||||
# CONFIG_REGULATOR_RT6245 is not set
|
||||
# CONFIG_REGULATOR_RTQ2134 is not set
|
||||
# CONFIG_REGULATOR_RTMV20 is not set
|
||||
# CONFIG_REGULATOR_RTQ6752 is not set
|
||||
# CONFIG_REGULATOR_SLG51000 is not set
|
||||
# CONFIG_REGULATOR_SY8106A is not set
|
||||
# CONFIG_REGULATOR_SY8824X is not set
|
||||
|
@ -2547,7 +2570,9 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y
|
|||
# CONFIG_VIDEO_IMX290 is not set
|
||||
# CONFIG_VIDEO_IMX319 is not set
|
||||
# CONFIG_VIDEO_IMX334 is not set
|
||||
# CONFIG_VIDEO_IMX335 is not set
|
||||
# CONFIG_VIDEO_IMX355 is not set
|
||||
# CONFIG_VIDEO_IMX412 is not set
|
||||
# CONFIG_VIDEO_OV02A10 is not set
|
||||
# CONFIG_VIDEO_OV2640 is not set
|
||||
# CONFIG_VIDEO_OV2659 is not set
|
||||
|
@ -2568,6 +2593,7 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y
|
|||
# CONFIG_VIDEO_OV7740 is not set
|
||||
# CONFIG_VIDEO_OV8856 is not set
|
||||
# CONFIG_VIDEO_OV8865 is not set
|
||||
# CONFIG_VIDEO_OV9282 is not set
|
||||
# CONFIG_VIDEO_OV9640 is not set
|
||||
# CONFIG_VIDEO_OV9650 is not set
|
||||
# CONFIG_VIDEO_OV13858 is not set
|
||||
|
@ -2629,6 +2655,7 @@ CONFIG_MEDIA_HIDE_ANCILLARY_SUBDRV=y
|
|||
#
|
||||
# CONFIG_IMX_IPUV3_CORE is not set
|
||||
CONFIG_DRM=y
|
||||
CONFIG_DRM_MIPI_DBI=y
|
||||
CONFIG_DRM_MIPI_DSI=y
|
||||
# CONFIG_DRM_DP_AUX_CHARDEV is not set
|
||||
# CONFIG_DRM_DEBUG_MM is not set
|
||||
|
@ -2688,7 +2715,9 @@ CONFIG_DRM_PANEL=y
|
|||
# CONFIG_DRM_PANEL_FEIXIN_K101_IM2BA02 is not set
|
||||
# CONFIG_DRM_PANEL_FEIYANG_FY07024DI26A30D is not set
|
||||
# CONFIG_DRM_PANEL_ILITEK_IL9322 is not set
|
||||
# CONFIG_DRM_PANEL_ILITEK_ILI9341 is not set
|
||||
# CONFIG_DRM_PANEL_ILITEK_ILI9881C is not set
|
||||
# CONFIG_DRM_PANEL_INNOLUX_EJ030NA is not set
|
||||
# CONFIG_DRM_PANEL_INNOLUX_P079ZCA is not set
|
||||
# CONFIG_DRM_PANEL_JDI_LT070ME05000 is not set
|
||||
# CONFIG_DRM_PANEL_KHADAS_TS050 is not set
|
||||
|
@ -2711,6 +2740,8 @@ CONFIG_DRM_PANEL_NOVATEK_NT35510=y
|
|||
# CONFIG_DRM_PANEL_RAYDIUM_RM67191 is not set
|
||||
# CONFIG_DRM_PANEL_RAYDIUM_RM68200 is not set
|
||||
# CONFIG_DRM_PANEL_RONBO_RB070D30 is not set
|
||||
# CONFIG_DRM_PANEL_SAMSUNG_ATNA33XC20 is not set
|
||||
# CONFIG_DRM_PANEL_SAMSUNG_DB7430 is not set
|
||||
CONFIG_DRM_PANEL_SAMSUNG_S6D16D0=y
|
||||
# CONFIG_DRM_PANEL_SAMSUNG_S6E3HA2 is not set
|
||||
# CONFIG_DRM_PANEL_SAMSUNG_S6E63J0X03 is not set
|
||||
|
@ -2735,6 +2766,7 @@ CONFIG_DRM_PANEL_SONY_ACX424AKP=y
|
|||
# CONFIG_DRM_PANEL_TPO_TPG110 is not set
|
||||
# CONFIG_DRM_PANEL_TRULY_NT35597_WQXGA is not set
|
||||
# CONFIG_DRM_PANEL_VISIONOX_RM69299 is not set
|
||||
# CONFIG_DRM_PANEL_WIDECHIPS_WS2401 is not set
|
||||
# CONFIG_DRM_PANEL_XINPENG_XPP055C272 is not set
|
||||
# end of Display Panels
|
||||
|
||||
|
@ -3001,6 +3033,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y
|
|||
# CONFIG_SND_SOC_ES8328_I2C is not set
|
||||
# CONFIG_SND_SOC_ES8328_SPI is not set
|
||||
# CONFIG_SND_SOC_GTM601 is not set
|
||||
# CONFIG_SND_SOC_ICS43432 is not set
|
||||
# CONFIG_SND_SOC_INNO_RK3036 is not set
|
||||
# CONFIG_SND_SOC_MAX98088 is not set
|
||||
# CONFIG_SND_SOC_MAX98357A is not set
|
||||
|
@ -3034,6 +3067,7 @@ CONFIG_SND_SOC_AB8500_CODEC=y
|
|||
# CONFIG_SND_SOC_SIMPLE_MUX is not set
|
||||
# CONFIG_SND_SOC_SPDIF is not set
|
||||
# CONFIG_SND_SOC_SSM2305 is not set
|
||||
# CONFIG_SND_SOC_SSM2518 is not set
|
||||
# CONFIG_SND_SOC_SSM2602_SPI is not set
|
||||
# CONFIG_SND_SOC_SSM2602_I2C is not set
|
||||
# CONFIG_SND_SOC_SSM4567 is not set
|
||||
|
@ -3087,7 +3121,6 @@ CONFIG_SND_SOC_AB8500_CODEC=y
|
|||
# CONFIG_SND_SOC_WM8978 is not set
|
||||
# CONFIG_SND_SOC_WM8985 is not set
|
||||
# CONFIG_SND_SOC_ZL38060 is not set
|
||||
# CONFIG_SND_SOC_ZX_AUD96P22 is not set
|
||||
# CONFIG_SND_SOC_MAX9759 is not set
|
||||
# CONFIG_SND_SOC_MT6351 is not set
|
||||
# CONFIG_SND_SOC_MT6358 is not set
|
||||
|
@ -3353,9 +3386,7 @@ CONFIG_LEDS_CLASS_FLASH=y
|
|||
#
|
||||
# LED drivers
|
||||
#
|
||||
# CONFIG_LEDS_AAT1290 is not set
|
||||
# CONFIG_LEDS_AN30259A is not set
|
||||
# CONFIG_LEDS_AS3645A is not set
|
||||
# CONFIG_LEDS_AW2013 is not set
|
||||
# CONFIG_LEDS_BCM6328 is not set
|
||||
# CONFIG_LEDS_BCM6358 is not set
|
||||
|
@ -3365,7 +3396,6 @@ CONFIG_LEDS_LM3530=y
|
|||
# CONFIG_LEDS_LM3532 is not set
|
||||
# CONFIG_LEDS_LM3642 is not set
|
||||
# CONFIG_LEDS_LM3692X is not set
|
||||
# CONFIG_LEDS_LM3601X is not set
|
||||
# CONFIG_LEDS_PCA9532 is not set
|
||||
CONFIG_LEDS_GPIO=y
|
||||
# CONFIG_LEDS_LP3944 is not set
|
||||
|
@ -3386,7 +3416,6 @@ CONFIG_LEDS_LP5521=y
|
|||
# CONFIG_LEDS_TCA6507 is not set
|
||||
# CONFIG_LEDS_TLC591XX is not set
|
||||
# CONFIG_LEDS_LM355x is not set
|
||||
# CONFIG_LEDS_KTD2692 is not set
|
||||
# CONFIG_LEDS_IS31FL319X is not set
|
||||
# CONFIG_LEDS_IS31FL32XX is not set
|
||||
|
||||
|
@ -3399,13 +3428,17 @@ CONFIG_LEDS_LP5521=y
|
|||
# CONFIG_LEDS_USER is not set
|
||||
# CONFIG_LEDS_SPI_BYTE is not set
|
||||
# CONFIG_LEDS_TI_LMU_COMMON is not set
|
||||
# CONFIG_LEDS_SGM3140 is not set
|
||||
|
||||
#
|
||||
# Flash and Torch LED drivers
|
||||
#
|
||||
# CONFIG_LEDS_AAT1290 is not set
|
||||
# CONFIG_LEDS_AS3645A is not set
|
||||
# CONFIG_LEDS_KTD2692 is not set
|
||||
# CONFIG_LEDS_LM3601X is not set
|
||||
# CONFIG_LEDS_RT4505 is not set
|
||||
CONFIG_LEDS_RT8515=y
|
||||
# CONFIG_LEDS_SGM3140 is not set
|
||||
|
||||
#
|
||||
# LED Triggers
|
||||
|
@ -3586,6 +3619,7 @@ CONFIG_SYNC_FILE=y
|
|||
# CONFIG_DMABUF_DEBUG is not set
|
||||
# CONFIG_DMABUF_SELFTESTS is not set
|
||||
# CONFIG_DMABUF_HEAPS is not set
|
||||
# CONFIG_DMABUF_SYSFS_STATS is not set
|
||||
# end of DMABUF options
|
||||
|
||||
# CONFIG_AUXDISPLAY is not set
|
||||
|
@ -3905,6 +3939,7 @@ CONFIG_IIO_RESCALE=y
|
|||
# CONFIG_PMS7003 is not set
|
||||
# CONFIG_SCD30_CORE is not set
|
||||
# CONFIG_SENSIRION_SGP30 is not set
|
||||
# CONFIG_SENSIRION_SGP40 is not set
|
||||
# CONFIG_SPS30_I2C is not set
|
||||
# CONFIG_SPS30_SERIAL is not set
|
||||
# CONFIG_VZ89X is not set
|
||||
|
@ -4159,6 +4194,7 @@ CONFIG_IIO_HRTIMER_TRIGGER=y
|
|||
#
|
||||
# Digital potentiometers
|
||||
#
|
||||
# CONFIG_AD5110 is not set
|
||||
# CONFIG_AD5272 is not set
|
||||
# CONFIG_DS1803 is not set
|
||||
# CONFIG_MAX5432 is not set
|
||||
|
@ -4297,6 +4333,7 @@ CONFIG_ARM_PMU=y
|
|||
# CONFIG_DAX is not set
|
||||
CONFIG_NVMEM=y
|
||||
CONFIG_NVMEM_SYSFS=y
|
||||
# CONFIG_NVMEM_NINTENDO_OTP is not set
|
||||
# CONFIG_NVMEM_RMEM is not set
|
||||
|
||||
#
|
||||
|
@ -4349,7 +4386,6 @@ CONFIG_FS_POSIX_ACL=y
|
|||
CONFIG_EXPORTFS=y
|
||||
# CONFIG_EXPORTFS_BLOCK_OPS is not set
|
||||
CONFIG_FILE_LOCKING=y
|
||||
CONFIG_MANDATORY_FILE_LOCKING=y
|
||||
# CONFIG_FS_ENCRYPTION is not set
|
||||
# CONFIG_FS_VERITY is not set
|
||||
CONFIG_FSNOTIFY=y
|
||||
|
@ -4386,6 +4422,9 @@ CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
|||
# CONFIG_FAT_DEFAULT_UTF8 is not set
|
||||
# CONFIG_EXFAT_FS is not set
|
||||
# CONFIG_NTFS_FS is not set
|
||||
CONFIG_NTFS3_FS=m
|
||||
CONFIG_NTFS3_LZX_XPRESS=y
|
||||
CONFIG_NTFS3_FS_POSIX_ACL=y
|
||||
# end of DOS/FAT/EXFAT/NT Filesystems
|
||||
|
||||
#
|
||||
|
@ -4423,6 +4462,7 @@ CONFIG_SUNRPC=y
|
|||
# CONFIG_SUNRPC_DEBUG is not set
|
||||
# CONFIG_CEPH_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_SMB_SERVER is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
CONFIG_NLS=y
|
||||
|
@ -4612,7 +4652,7 @@ CONFIG_CRYPTO_GHASH=y
|
|||
# CONFIG_CRYPTO_RMD160 is not set
|
||||
CONFIG_CRYPTO_SHA1=y
|
||||
CONFIG_CRYPTO_SHA256=y
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
CONFIG_CRYPTO_SHA512=y
|
||||
# CONFIG_CRYPTO_SHA3 is not set
|
||||
# CONFIG_CRYPTO_SM3 is not set
|
||||
# CONFIG_CRYPTO_STREEBOG is not set
|
||||
|
@ -4790,7 +4830,6 @@ CONFIG_FONT_SUPPORT=y
|
|||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_SBITMAP=y
|
||||
# CONFIG_STRING_SELFTEST is not set
|
||||
# end of Library routines
|
||||
|
||||
CONFIG_GENERIC_LIB_DEVMEM_IS_ALLOWED=y
|
||||
|
@ -4955,7 +4994,6 @@ CONFIG_RCU_TRACE=y
|
|||
# end of RCU Debugging
|
||||
|
||||
# CONFIG_DEBUG_WQ_FORCE_RR_CPU is not set
|
||||
# CONFIG_DEBUG_BLOCK_EXT_DEVT is not set
|
||||
# CONFIG_CPU_HOTPLUG_STATE_CONTROL is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||
|
@ -5006,7 +5044,6 @@ CONFIG_CC_HAS_SANCOV_TRACE_PC=y
|
|||
CONFIG_RUNTIME_TESTING_MENU=y
|
||||
# CONFIG_LKDTM is not set
|
||||
# CONFIG_TEST_MIN_HEAP is not set
|
||||
# CONFIG_TEST_SORT is not set
|
||||
# CONFIG_TEST_DIV64 is not set
|
||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||
# CONFIG_RBTREE_TEST is not set
|
||||
|
@ -5015,6 +5052,7 @@ CONFIG_RUNTIME_TESTING_MENU=y
|
|||
# CONFIG_PERCPU_TEST is not set
|
||||
# CONFIG_ATOMIC64_SELFTEST is not set
|
||||
# CONFIG_TEST_HEXDUMP is not set
|
||||
# CONFIG_STRING_SELFTEST is not set
|
||||
# CONFIG_TEST_STRING_HELPERS is not set
|
||||
# CONFIG_TEST_STRSCPY is not set
|
||||
# CONFIG_TEST_KSTRTOX is not set
|
||||
|
|
|
@ -2,24 +2,21 @@ Some boot partitions on the Samsung 4GB KLM4G1YE4C "4YMD1R" and "M4G1YC"
|
|||
cards appear broken when accessed randomly. CMD6 to switch back to the main
|
||||
partition randomly stalls after CMD18 access to the boot partition 1, and
|
||||
the card never comes back online. The accesses to the boot partitions work
|
||||
several times before this happens.
|
||||
several times before this happens, but eventually the card access hangs
|
||||
while initializing the card.
|
||||
|
||||
Some problematic eMMC cards are found in the Samsung GT-S7710 mobile phone.
|
||||
Some problematic eMMC cards are found in the Samsung GT-S7710 (Skomer)
|
||||
and SGH-I407 (Kyle) mobile phones.
|
||||
|
||||
I tried using only single blocks with CMD17 on the boot partitions with the
|
||||
result that it crashed even faster.
|
||||
|
||||
The card may survive on older kernels, but this seems to be because recent
|
||||
kernel partition parsers are accessing the boot partitions more, and we get
|
||||
more block traffic to the boot partitions during kernel startup.
|
||||
|
||||
After applying this patch, the main partition can be accessed and mounted
|
||||
without problems.
|
||||
|
||||
After a bit of root cause analysis it turns out that these old eMMC cards
|
||||
cannot do hardware busy detection (monitoring DAT0) properly. This explains
|
||||
why older kernels work since we only recently added support for this to the
|
||||
MMCI driver which is used with these cards on these platforms.
|
||||
probably cannot do hardware busy detection (monitoring DAT0) properly.
|
||||
|
||||
The card survives on older kernels, but this is because recent kernels have
|
||||
added busy detection handling for the SoC used in these phones, exposing
|
||||
the issue.
|
||||
|
||||
Construct a quirk that makes the MMC cord avoid using the ->card_busy()
|
||||
callback if the card is listed with MMC_QUIRK_BROKEN_HW_BUSY_DETECT and
|
||||
|
@ -39,6 +36,9 @@ they seem to mostly read a register reflecting the value of DAT0 for this
|
|||
which works fine with the quirk in this patch. However if the error appear
|
||||
on other hosts they might need additional fixes.
|
||||
|
||||
After applying this patch, the main partition can be accessed and mounted
|
||||
without problems on Samsung GT-S7710 and SGH-I407.
|
||||
|
||||
Fixes: cb0335b778c7 ("mmc: mmci: add busy_complete callback")
|
||||
Cc: stable@vger.kernel.org
|
||||
Cc: phone-devel@vger.kernel.org
|
||||
|
@ -46,20 +46,18 @@ Cc: Ludovic Barre <ludovic.barre@st.com>
|
|||
Cc: Stephan Gerhold <stephan@gerhold.net>
|
||||
Reported-by: newbyte@disroot.org
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
Signed-off-by: Stefan Hansson <newbyte@disroot.org>
|
||||
---
|
||||
ChangeLog v3->v4
|
||||
- Rebase on v5.15-rc1
|
||||
ChangeLog v2->v3:
|
||||
- Rebase on v5.14-rc1
|
||||
- Reword the commit message slightly.
|
||||
ChangeLog v1->v2:
|
||||
- Rewrite to reflect the actual problem of broken busy detection.
|
||||
---
|
||||
drivers/mmc/core/core.c | 8 ++++----
|
||||
drivers/mmc/core/core.h | 17 +++++++++++++++++
|
||||
drivers/mmc/core/mmc_ops.c | 4 ++--
|
||||
drivers/mmc/core/quirks.h | 21 +++++++++++++++++++++
|
||||
drivers/mmc/host/mmci.c | 22 ++++++++++++++++++++--
|
||||
include/linux/mmc/card.h | 1 +
|
||||
6 files changed, 65 insertions(+), 8 deletions(-)
|
||||
|
||||
diff --git a/drivers/mmc/core/core.c b/drivers/mmc/core/core.c
|
||||
index f194940c5974..7142a806f6a6 100644
|
||||
index 240c5af793dc..266f21a7d38e 100644
|
||||
--- a/drivers/mmc/core/core.c
|
||||
+++ b/drivers/mmc/core/core.c
|
||||
@@ -232,7 +232,7 @@ static void __mmc_start_request(struct mmc_host *host, struct mmc_request *mrq)
|
||||
|
@ -71,7 +69,7 @@ index f194940c5974..7142a806f6a6 100644
|
|||
int tries = 500; /* Wait aprox 500ms at maximum */
|
||||
|
||||
while (host->ops->card_busy(host) && --tries)
|
||||
@@ -1197,7 +1197,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
|
||||
@@ -1201,7 +1201,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
|
||||
*/
|
||||
if (!host->ops->start_signal_voltage_switch)
|
||||
return -EPERM;
|
||||
|
@ -80,7 +78,7 @@ index f194940c5974..7142a806f6a6 100644
|
|||
pr_warn("%s: cannot verify signal voltage switch\n",
|
||||
mmc_hostname(host));
|
||||
|
||||
@@ -1217,7 +1217,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
|
||||
@@ -1221,7 +1221,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
|
||||
* after the response of cmd11, but wait 1 ms to be sure
|
||||
*/
|
||||
mmc_delay(1);
|
||||
|
@ -89,7 +87,7 @@ index f194940c5974..7142a806f6a6 100644
|
|||
err = -EAGAIN;
|
||||
goto power_cycle;
|
||||
}
|
||||
@@ -1238,7 +1238,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
|
||||
@@ -1242,7 +1242,7 @@ int mmc_set_uhs_voltage(struct mmc_host *host, u32 ocr)
|
||||
* Failure to switch is indicated by the card holding
|
||||
* dat[0:3] low
|
||||
*/
|
||||
|
@ -99,11 +97,11 @@ index f194940c5974..7142a806f6a6 100644
|
|||
|
||||
power_cycle:
|
||||
diff --git a/drivers/mmc/core/core.h b/drivers/mmc/core/core.h
|
||||
index db3c9c68875d..68091bbba580 100644
|
||||
index 7931a4f0137d..522abb18c6dd 100644
|
||||
--- a/drivers/mmc/core/core.h
|
||||
+++ b/drivers/mmc/core/core.h
|
||||
@@ -172,4 +172,21 @@ static inline bool mmc_cache_enabled(struct mmc_host *host)
|
||||
return false;
|
||||
@@ -183,4 +183,21 @@ static inline int mmc_flush_cache(struct mmc_host *host)
|
||||
return 0;
|
||||
}
|
||||
|
||||
+/**
|
||||
|
@ -125,26 +123,26 @@ index db3c9c68875d..68091bbba580 100644
|
|||
+
|
||||
#endif
|
||||
diff --git a/drivers/mmc/core/mmc_ops.c b/drivers/mmc/core/mmc_ops.c
|
||||
index 5756781fef37..5f37e280dc1c 100644
|
||||
index 0c54858e89c0..43db47c296ea 100644
|
||||
--- a/drivers/mmc/core/mmc_ops.c
|
||||
+++ b/drivers/mmc/core/mmc_ops.c
|
||||
@@ -431,7 +431,7 @@ static int mmc_busy_status(struct mmc_card *card, bool retry_crc_err,
|
||||
@@ -435,7 +435,7 @@ static int mmc_busy_cb(void *cb_data, bool *busy)
|
||||
u32 status = 0;
|
||||
int err;
|
||||
|
||||
- if (host->ops->card_busy) {
|
||||
+ if (mmc_hw_busy_detect(host)) {
|
||||
- if (data->busy_cmd != MMC_BUSY_IO && host->ops->card_busy) {
|
||||
+ if (data->busy_cmd != MMC_BUSY_IO && mmc_hw_busy_detect(host)) {
|
||||
*busy = host->ops->card_busy(host);
|
||||
return 0;
|
||||
}
|
||||
@@ -480,7 +480,7 @@ static int __mmc_poll_for_busy(struct mmc_card *card, unsigned int timeout_ms,
|
||||
* capable of polling by using ->card_busy(), then rely on waiting the
|
||||
* stated timeout to be sufficient.
|
||||
@@ -600,7 +600,7 @@ int __mmc_switch(struct mmc_card *card, u8 set, u8 index, u8 value,
|
||||
* when it's not allowed to poll by using CMD13, then we need to rely on
|
||||
* waiting the stated timeout to be sufficient.
|
||||
*/
|
||||
- if (!send_status && !host->ops->card_busy) {
|
||||
+ if (!send_status && mmc_hw_busy_detect(host)) {
|
||||
+ if (!send_status && !mmc_hw_busy_detect(host)) {
|
||||
mmc_delay(timeout_ms);
|
||||
return 0;
|
||||
goto out_tim;
|
||||
}
|
||||
diff --git a/drivers/mmc/core/quirks.h b/drivers/mmc/core/quirks.h
|
||||
index d68e6e513a4f..8da6526f0eb0 100644
|
||||
|
@ -179,7 +177,7 @@ index d68e6e513a4f..8da6526f0eb0 100644
|
|||
};
|
||||
|
||||
diff --git a/drivers/mmc/host/mmci.c b/drivers/mmc/host/mmci.c
|
||||
index 984d35055156..3046917b2b67 100644
|
||||
index 3765e2f4ad98..79a2f143573e 100644
|
||||
--- a/drivers/mmc/host/mmci.c
|
||||
+++ b/drivers/mmc/host/mmci.c
|
||||
@@ -347,6 +347,24 @@ static int mmci_card_busy(struct mmc_host *mmc)
|
||||
|
@ -226,10 +224,10 @@ index 984d35055156..3046917b2b67 100644
|
|||
|
||||
if (host->variant->busy_timeout && mmc->actual_clock)
|
||||
diff --git a/include/linux/mmc/card.h b/include/linux/mmc/card.h
|
||||
index f9ad35dd6012..b9a12e925a5b 100644
|
||||
index 37f975875102..b922ffd4e0f0 100644
|
||||
--- a/include/linux/mmc/card.h
|
||||
+++ b/include/linux/mmc/card.h
|
||||
@@ -259,6 +259,7 @@ struct mmc_card {
|
||||
@@ -281,6 +281,7 @@ struct mmc_card {
|
||||
/* for byte mode */
|
||||
#define MMC_QUIRK_NONSTD_SDIO (1<<2) /* non-standard SDIO card attached */
|
||||
/* (missing CIA registers) */
|
||||
|
@ -237,5 +235,3 @@ index f9ad35dd6012..b9a12e925a5b 100644
|
|||
#define MMC_QUIRK_NONSTD_FUNC_IF (1<<4) /* SDIO card has nonstd function interfaces */
|
||||
#define MMC_QUIRK_DISABLE_CD (1<<5) /* disconnect CD/DAT[3] resistor */
|
||||
#define MMC_QUIRK_INAND_CMD38 (1<<6) /* iNAND devices have broken CMD38 */
|
||||
--
|
||||
2.31.1
|
||||
|
|
|
@ -1,116 +0,0 @@
|
|||
After some crashes in the 3D engine (!) on the Samsung GT-I8530
|
||||
it turns out that the main firmware file can be device dependent,
|
||||
something that was previously only handled for the NVRAM
|
||||
parameter file.
|
||||
|
||||
Rewrite the code a bit so we can a per-board suffixed firmware
|
||||
binary as well, if this does not exist we fall back to the
|
||||
canonical firmware name.
|
||||
|
||||
Example: a 4330 device with the OF board compatible is
|
||||
"samsung,gavini". We will first try
|
||||
"brcmfmac4330-sdio.samsung,gavini.bin" then "brcmfmac4330-sdio.bin"
|
||||
if that does not work.
|
||||
|
||||
Cc: phone-devel@vger.kernel.org
|
||||
Cc: newbyte@disroot.org
|
||||
Cc: Stephan Gerhold <stephan@gerhold.net>
|
||||
Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
|
||||
---
|
||||
.../broadcom/brcm80211/brcmfmac/firmware.c | 53 +++++++++++++++----
|
||||
1 file changed, 42 insertions(+), 11 deletions(-)
|
||||
|
||||
diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
index d40104b8df55..adfdfc654b10 100644
|
||||
--- a/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
+++ b/drivers/net/wireless/broadcom/brcm80211/brcmfmac/firmware.c
|
||||
@@ -594,28 +594,47 @@ static int brcmf_fw_complete_request(const struct firmware *fw,
|
||||
return (cur->flags & BRCMF_FW_REQF_OPTIONAL) ? 0 : ret;
|
||||
}
|
||||
|
||||
+static char *brcm_alt_fw_path(const char *path, const char *board_type)
|
||||
+{
|
||||
+ char alt_path[BRCMF_FW_NAME_LEN];
|
||||
+ char suffix[5];
|
||||
+
|
||||
+ strscpy(alt_path, path, BRCMF_FW_NAME_LEN);
|
||||
+ /* At least one character + suffix */
|
||||
+ if (strlen(alt_path) < 5)
|
||||
+ return NULL;
|
||||
+
|
||||
+ /* strip .txt or .bin at the end */
|
||||
+ strscpy(suffix, alt_path + strlen(alt_path) - 4, 5);
|
||||
+ alt_path[strlen(alt_path) - 4] = 0;
|
||||
+ strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(alt_path, board_type, BRCMF_FW_NAME_LEN);
|
||||
+ strlcat(alt_path, suffix, BRCMF_FW_NAME_LEN);
|
||||
+
|
||||
+ return kstrdup(alt_path, GFP_KERNEL);
|
||||
+}
|
||||
+
|
||||
static int brcmf_fw_request_firmware(const struct firmware **fw,
|
||||
struct brcmf_fw *fwctx)
|
||||
{
|
||||
struct brcmf_fw_item *cur = &fwctx->req->items[fwctx->curpos];
|
||||
int ret;
|
||||
|
||||
- /* nvram files are board-specific, first try a board-specific path */
|
||||
+ /* Files can be board-specific, first try a board-specific path */
|
||||
if (cur->type == BRCMF_FW_TYPE_NVRAM && fwctx->req->board_type) {
|
||||
- char alt_path[BRCMF_FW_NAME_LEN];
|
||||
+ char *alt_path;
|
||||
|
||||
- strlcpy(alt_path, cur->path, BRCMF_FW_NAME_LEN);
|
||||
- /* strip .txt at the end */
|
||||
- alt_path[strlen(alt_path) - 4] = 0;
|
||||
- strlcat(alt_path, ".", BRCMF_FW_NAME_LEN);
|
||||
- strlcat(alt_path, fwctx->req->board_type, BRCMF_FW_NAME_LEN);
|
||||
- strlcat(alt_path, ".txt", BRCMF_FW_NAME_LEN);
|
||||
+ alt_path = brcm_alt_fw_path(cur->path, fwctx->req->board_type);
|
||||
+ if (!alt_path)
|
||||
+ goto fallback;
|
||||
|
||||
ret = request_firmware(fw, alt_path, fwctx->dev);
|
||||
+ kfree(alt_path);
|
||||
if (ret == 0)
|
||||
return ret;
|
||||
}
|
||||
|
||||
+fallback:
|
||||
return request_firmware(fw, cur->path, fwctx->dev);
|
||||
}
|
||||
|
||||
@@ -660,6 +679,7 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
{
|
||||
struct brcmf_fw_item *first = &req->items[0];
|
||||
struct brcmf_fw *fwctx;
|
||||
+ char *alt_path;
|
||||
int ret;
|
||||
|
||||
brcmf_dbg(TRACE, "enter: dev=%s\n", dev_name(dev));
|
||||
@@ -677,9 +697,20 @@ int brcmf_fw_get_firmwares(struct device *dev, struct brcmf_fw_request *req,
|
||||
fwctx->req = req;
|
||||
fwctx->done = fw_cb;
|
||||
|
||||
- ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
- fwctx->dev, GFP_KERNEL, fwctx,
|
||||
- brcmf_fw_request_done);
|
||||
+ /* First try alternative board-specific path if any */
|
||||
+ alt_path = brcm_alt_fw_path(first->path, fwctx->req->board_type);
|
||||
+ if (alt_path) {
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true, alt_path,
|
||||
+ fwctx->dev, GFP_KERNEL, fwctx,
|
||||
+ brcmf_fw_request_done);
|
||||
+ kfree(alt_path);
|
||||
+ }
|
||||
+ /* Else try canonical path */
|
||||
+ if (ret) {
|
||||
+ ret = request_firmware_nowait(THIS_MODULE, true, first->path,
|
||||
+ fwctx->dev, GFP_KERNEL, fwctx,
|
||||
+ brcmf_fw_request_done);
|
||||
+ }
|
||||
if (ret < 0)
|
||||
brcmf_fw_request_done(NULL, fwctx);
|
||||
|
||||
--
|
||||
2.31.1
|
Loading…
Reference in a new issue