// SPDX-License-Identifier: GPL-2.0 // // General Purpose SPI multiplexer #include <linux/err.h> #include <linux/kernel.h> #include <linux/module.h> #include <linux/mux/consumer.h> #include <linux/slab.h> #include <linux/spi/spi.h> #define SPI_MUX_NO_CS … /** * DOC: Driver description * * This driver supports a MUX on an SPI bus. This can be useful when you need * more chip selects than the hardware peripherals support, or than are * available in a particular board setup. * * The driver will create an additional SPI controller. Devices added under the * mux will be handled as 'chip selects' on this controller. */ /** * struct spi_mux_priv - the basic spi_mux structure * @spi: pointer to the device struct attached to the parent * spi controller * @current_cs: The current chip select set in the mux * @child_msg_complete: The mux replaces the complete callback in the child's * message to its own callback; this field is used by the * driver to store the child's callback during a transfer * @child_msg_context: Used to store the child's context to the callback * @child_msg_dev: Used to store the spi_device pointer to the child * @mux: mux_control structure used to provide chip selects for * downstream spi devices */ struct spi_mux_priv { … }; /* should not get called when the parent controller is doing a transfer */ static int spi_mux_select(struct spi_device *spi) { … } static int spi_mux_setup(struct spi_device *spi) { … } static void spi_mux_complete_cb(void *context) { … } static int spi_mux_transfer_one_message(struct spi_controller *ctlr, struct spi_message *m) { … } static int spi_mux_probe(struct spi_device *spi) { … } static const struct spi_device_id spi_mux_id[] = …; MODULE_DEVICE_TABLE(spi, spi_mux_id); static const struct of_device_id spi_mux_of_match[] = …; MODULE_DEVICE_TABLE(of, spi_mux_of_match); static struct spi_driver spi_mux_driver = …; module_spi_driver(…) …; MODULE_DESCRIPTION(…) …; MODULE_LICENSE(…) …;