80 lines
2.8 KiB
Diff
80 lines
2.8 KiB
Diff
From 783917502bc47a28b0ee6b877bf56342bf6e4f9b Mon Sep 17 00:00:00 2001
|
|
From: John Garry <john.garry@huawei.com>
|
|
Date: Fri, 28 Feb 2020 23:18:49 +0800
|
|
Subject: [PATCH 26/39] spi: Allow SPI controller override device buswidth
|
|
|
|
mainline inclusion
|
|
from mainline-v5.7-rc1
|
|
commit ea23578611dce2eeaf31dcfe12cd7130cf3d1411
|
|
category: feature
|
|
bugzilla: https://gitee.com/openeuler/kernel/issues/I8CSBP
|
|
CVE: NA
|
|
|
|
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ea23578611dce2eeaf31dcfe12cd7130cf3d1411
|
|
|
|
----------------------------------------------------------------------------
|
|
|
|
Currently ACPI firmware description for a SPI device does not have any
|
|
method to describe the data buswidth on the board.
|
|
|
|
So even through the controller and device may support higher modes than
|
|
standard SPI, it cannot be assumed that the board does - as such, that
|
|
device is limited to standard SPI in such a circumstance.
|
|
|
|
As a workaround, allow the controller driver supply buswidth override bits,
|
|
which are used inform the core code that the controller driver knows the
|
|
buswidth supported on that board for that device.
|
|
|
|
A host controller driver might know this info from DMI tables, for example.
|
|
|
|
Signed-off-by: John Garry <john.garry@huawei.com>
|
|
Link: https://lore.kernel.org/r/1582903131-160033-2-git-send-email-john.garry@huawei.com
|
|
Signed-off-by: Mark Brown <broonie@kernel.org>
|
|
Signed-off-by: YunYi Yang <yangyunyi2@huawei.com>
|
|
---
|
|
drivers/spi/spi.c | 4 +++-
|
|
include/linux/spi/spi.h | 3 +++
|
|
2 files changed, 6 insertions(+), 1 deletion(-)
|
|
|
|
diff --git a/drivers/spi/spi.c b/drivers/spi/spi.c
|
|
index 69d569744ea1..a4f366a77072 100644
|
|
--- a/drivers/spi/spi.c
|
|
+++ b/drivers/spi/spi.c
|
|
@@ -474,6 +474,7 @@ struct spi_device *spi_alloc_device(struct spi_controller *ctlr)
|
|
spi->dev.bus = &spi_bus_type;
|
|
spi->dev.release = spidev_release;
|
|
spi->cs_gpio = -ENOENT;
|
|
+ spi->mode = ctlr->buswidth_override_bits;
|
|
|
|
spin_lock_init(&spi->statistics.lock);
|
|
|
|
@@ -1871,9 +1872,10 @@ static acpi_status acpi_register_spi_device(struct spi_controller *ctlr,
|
|
return AE_NO_MEMORY;
|
|
}
|
|
|
|
+
|
|
ACPI_COMPANION_SET(&spi->dev, adev);
|
|
spi->max_speed_hz = lookup.max_speed_hz;
|
|
- spi->mode = lookup.mode;
|
|
+ spi->mode |= lookup.mode;
|
|
spi->irq = lookup.irq;
|
|
spi->bits_per_word = lookup.bits_per_word;
|
|
spi->chip_select = lookup.chip_select;
|
|
diff --git a/include/linux/spi/spi.h b/include/linux/spi/spi.h
|
|
index 80d6bd6e46c5..843f187e046b 100644
|
|
--- a/include/linux/spi/spi.h
|
|
+++ b/include/linux/spi/spi.h
|
|
@@ -434,6 +434,9 @@ struct spi_controller {
|
|
/* spi_device.mode flags understood by this controller driver */
|
|
u16 mode_bits;
|
|
|
|
+ /* spi_device.mode flags override flags for this controller */
|
|
+ u32 buswidth_override_bits;
|
|
+
|
|
/* bitmask of supported bits_per_word for transfers */
|
|
u32 bits_per_word_mask;
|
|
#define SPI_BPW_MASK(bits) BIT((bits) - 1)
|
|
--
|
|
2.27.0
|
|
|