Commit Graph

6 Commits

Author SHA1 Message Date
Mark Salter 827edf908c spi: mux: Fix mux interaction with fast path optimisations
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2071848
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2122415

commit b30f7c8eb0780e1479a9882526e838664271f4c9
Author: Mark Brown <broonie@kernel.org>
Date: Thu, 1 Sep 2022 13:07:32 +0100

    The spi-mux driver is rather too clever and attempts to resubmit any
    message that is submitted to it to the parent controller with some
    adjusted callbacks.  This does not play at all nicely with the fast
    path which now sets flags on the message indicating that it's being
    handled through the fast path, we see async messages flagged as being on
    the fast path.  Ideally the spi-mux code would duplicate the message but
    that's rather invasive and a bit fragile in that it relies on the mux
    knowing which fields in the message to copy.  Instead teach the core
    that there are controllers which can't cope with the fast path and have
    the mux flag itself as being such a controller, ensuring that messages
    going via the mux don't get partially handled via the fast path.

    This will reduce the performance of any spi-mux connected device since
    we'll now always use the thread for both the actual controller and the
    mux controller instead of just the actual controller but given that we
    were always hitting the slow path anyway it's hopefully not too much of
    an additional cost and it allows us to keep the fast path.

    Fixes: ae7d2346dc89 ("spi: Don't use the message queue if possible in spi_sync")
    Reported-by: Casper Andersson <casper.casan@gmail.com>
    Tested-by: Casper Andersson <casper.casan@gmail.com>
    Signed-off-by: Mark Brown <broonie@kernel.org>
    Link: https://lore.kernel.org/r/20220901120732.49245-1-broonie@kernel.org
    Signed-off-by: Mark Brown <broonie@kernel.org>

Signed-off-by: Mark Salter <msalter@redhat.com>
2023-01-26 13:30:55 -05:00
Mark Salter df89211b26 spi-mux: Fix false-positive lockdep splats
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2071848
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2122415

commit 16a8e2fbb2d49111004efc1c7342e083eafabeb0
Author: =?UTF-8?q?Uwe=20Kleine-K=C3=B6nig?= <u.kleine-koenig@pengutronix.de>
Date: Wed, 13 Oct 2021 15:37:10 +0200

    io_mutex is taken by spi_setup() and spi-mux's .setup() callback calls
    spi_setup() which results in a nested lock of io_mutex.

    add_lock is taken by spi_add_device(). The device_add() call in there
    can result in calling spi-mux's .probe() callback which registers its
    own spi controller which in turn results in spi_add_device() being
    called again.

    To fix this initialize the controller's locks already in
    spi_alloc_controller() to give spi_mux_probe() a chance to set the
    lockdep subclass.

    Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Link: https://lore.kernel.org/r/20211013133710.2679703-2-u.kleine-koenig@pengutronix.de
    Signed-off-by: Mark Brown <broonie@kernel.org>

Signed-off-by: Mark Salter <msalter@redhat.com>
2023-01-26 12:44:19 -05:00
Uwe Kleine-König 1d5ccab95f
spi: spi-mux: Add module info needed for autoloading
With the spi device table udev can autoload the spi-mux module in
the presence of an spi-mux device.

Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
Link: https://lore.kernel.org/r/20210721095321.2165453-1-u.kleine-koenig@pengutronix.de
Signed-off-by: Mark Brown <broonie@kernel.org>
2021-07-22 12:40:06 +01:00
Krzysztof Kozlowski 2d9bdf6455
spi: spi-mux: Simplify with dev_err_probe()
Common pattern of handling deferred probe can be simplified with
dev_err_probe().  Less code and the error value gets printed.

Signed-off-by: Krzysztof Kozlowski <krzk@kernel.org>
Link: https://lore.kernel.org/r/20200901152713.18629-6-krzk@kernel.org
Signed-off-by: Mark Brown <broonie@kernel.org>
2020-09-08 18:19:27 +01:00
Peter Rosin a2b02e4623
spi: mux: repair mux usage
It is not valid to cache/short out selection of the mux.

mux_control_select() only locks the mux until mux_control_deselect()
is called. mux_control_deselect() may put the mux in some low power
state or some other user of the mux might select it for other purposes.
These things are probably not happening in the original setting where
this driver was developed, but it is said to be a generic SPI mux.

Also, the mux framework will short out the actual low level muxing
operation when/if that is possible.

Fixes: e9e40543ad ("spi: Add generic SPI multiplexer")
Signed-off-by: Peter Rosin <peda@axentia.se>
Link: https://lore.kernel.org/r/20200525104352.26807-1-peda@axentia.se
Signed-off-by: Mark Brown <broonie@kernel.org>
2020-05-25 13:25:34 +01:00
Chris Packham e9e40543ad
spi: Add generic SPI multiplexer
Add a SPI device driver that sits in-band and provides a SPI controller
which supports chip selects via a mux-control. This enables extra SPI
devices to be connected with limited native chip selects.

Signed-off-by: Chris Packham <chris.packham@alliedtelesis.co.nz>
Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
Link: https://lore.kernel.org/r/20200204032838.20739-3-chris.packham@alliedtelesis.co.nz
Signed-off-by: Mark Brown <broonie@kernel.org>
2020-02-12 23:56:18 +00:00