Merge branch 'for-5.10' of https://git.kernel.org/pub/scm/linux/kernel/git/broonie/spi into spi-5.11
This commit is contained in:
commit
db4a831997
|
@ -256,6 +256,7 @@ config SPI_DW_BT1
|
|||
tristate "Baikal-T1 SPI driver for DW SPI core"
|
||||
depends on MIPS_BAIKAL_T1 || COMPILE_TEST
|
||||
select MULTIPLEXER
|
||||
select MUX_MMIO
|
||||
help
|
||||
Baikal-T1 SoC is equipped with three DW APB SSI-based MMIO SPI
|
||||
controllers. Two of them are pretty much normal: with IRQ, DMA,
|
||||
|
@ -269,8 +270,6 @@ config SPI_DW_BT1
|
|||
config SPI_DW_BT1_DIRMAP
|
||||
bool "Directly mapped Baikal-T1 Boot SPI flash support"
|
||||
depends on SPI_DW_BT1
|
||||
select MULTIPLEXER
|
||||
select MUX_MMIO
|
||||
help
|
||||
Directly mapped SPI flash memory is an interface specific to the
|
||||
Baikal-T1 System Boot Controller. It is a 16MB MMIO region, which
|
||||
|
|
|
@ -1327,7 +1327,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
|
|||
|
||||
data = of_id->data;
|
||||
|
||||
master = spi_alloc_master(dev, sizeof(struct bcm_qspi));
|
||||
master = devm_spi_alloc_master(dev, sizeof(struct bcm_qspi));
|
||||
if (!master) {
|
||||
dev_err(dev, "error allocating spi_master\n");
|
||||
return -ENOMEM;
|
||||
|
@ -1367,21 +1367,17 @@ int bcm_qspi_probe(struct platform_device *pdev,
|
|||
|
||||
if (res) {
|
||||
qspi->base[MSPI] = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(qspi->base[MSPI])) {
|
||||
ret = PTR_ERR(qspi->base[MSPI]);
|
||||
goto qspi_resource_err;
|
||||
}
|
||||
if (IS_ERR(qspi->base[MSPI]))
|
||||
return PTR_ERR(qspi->base[MSPI]);
|
||||
} else {
|
||||
goto qspi_resource_err;
|
||||
return 0;
|
||||
}
|
||||
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "bspi");
|
||||
if (res) {
|
||||
qspi->base[BSPI] = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(qspi->base[BSPI])) {
|
||||
ret = PTR_ERR(qspi->base[BSPI]);
|
||||
goto qspi_resource_err;
|
||||
}
|
||||
if (IS_ERR(qspi->base[BSPI]))
|
||||
return PTR_ERR(qspi->base[BSPI]);
|
||||
qspi->bspi_mode = true;
|
||||
} else {
|
||||
qspi->bspi_mode = false;
|
||||
|
@ -1392,18 +1388,14 @@ int bcm_qspi_probe(struct platform_device *pdev,
|
|||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "cs_reg");
|
||||
if (res) {
|
||||
qspi->base[CHIP_SELECT] = devm_ioremap_resource(dev, res);
|
||||
if (IS_ERR(qspi->base[CHIP_SELECT])) {
|
||||
ret = PTR_ERR(qspi->base[CHIP_SELECT]);
|
||||
goto qspi_resource_err;
|
||||
}
|
||||
if (IS_ERR(qspi->base[CHIP_SELECT]))
|
||||
return PTR_ERR(qspi->base[CHIP_SELECT]);
|
||||
}
|
||||
|
||||
qspi->dev_ids = kcalloc(num_irqs, sizeof(struct bcm_qspi_dev_id),
|
||||
GFP_KERNEL);
|
||||
if (!qspi->dev_ids) {
|
||||
ret = -ENOMEM;
|
||||
goto qspi_resource_err;
|
||||
}
|
||||
if (!qspi->dev_ids)
|
||||
return -ENOMEM;
|
||||
|
||||
for (val = 0; val < num_irqs; val++) {
|
||||
irq = -1;
|
||||
|
@ -1484,7 +1476,7 @@ int bcm_qspi_probe(struct platform_device *pdev,
|
|||
qspi->xfer_mode.addrlen = -1;
|
||||
qspi->xfer_mode.hp = -1;
|
||||
|
||||
ret = devm_spi_register_master(&pdev->dev, master);
|
||||
ret = spi_register_master(master);
|
||||
if (ret < 0) {
|
||||
dev_err(dev, "can't register master\n");
|
||||
goto qspi_reg_err;
|
||||
|
@ -1497,8 +1489,6 @@ qspi_reg_err:
|
|||
clk_disable_unprepare(qspi->clk);
|
||||
qspi_probe_err:
|
||||
kfree(qspi->dev_ids);
|
||||
qspi_resource_err:
|
||||
spi_master_put(master);
|
||||
return ret;
|
||||
}
|
||||
/* probe function to be called by SoC specific platform driver probe */
|
||||
|
@ -1508,10 +1498,10 @@ int bcm_qspi_remove(struct platform_device *pdev)
|
|||
{
|
||||
struct bcm_qspi *qspi = platform_get_drvdata(pdev);
|
||||
|
||||
spi_unregister_master(qspi->master);
|
||||
bcm_qspi_hw_uninit(qspi);
|
||||
clk_disable_unprepare(qspi->clk);
|
||||
kfree(qspi->dev_ids);
|
||||
spi_unregister_master(qspi->master);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1193,7 +1193,6 @@ static int bcm2835_spi_setup(struct spi_device *spi)
|
|||
struct spi_controller *ctlr = spi->controller;
|
||||
struct bcm2835_spi *bs = spi_controller_get_devdata(ctlr);
|
||||
struct gpio_chip *chip;
|
||||
enum gpio_lookup_flags lflags;
|
||||
u32 cs;
|
||||
|
||||
/*
|
||||
|
@ -1259,21 +1258,9 @@ static int bcm2835_spi_setup(struct spi_device *spi)
|
|||
if (!chip)
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* Retrieve the corresponding GPIO line used for CS.
|
||||
* The inversion semantics will be handled by the GPIO core
|
||||
* code, so we pass GPIOD_OUT_LOW for "unasserted" and
|
||||
* the correct flag for inversion semantics. The SPI_CS_HIGH
|
||||
* on spi->mode cannot be checked for polarity in this case
|
||||
* as the flag use_gpio_descriptors enforces SPI_CS_HIGH.
|
||||
*/
|
||||
if (of_property_read_bool(spi->dev.of_node, "spi-cs-high"))
|
||||
lflags = GPIO_ACTIVE_HIGH;
|
||||
else
|
||||
lflags = GPIO_ACTIVE_LOW;
|
||||
spi->cs_gpiod = gpiochip_request_own_desc(chip, 8 - spi->chip_select,
|
||||
DRV_NAME,
|
||||
lflags,
|
||||
GPIO_LOOKUP_FLAGS_DEFAULT,
|
||||
GPIOD_OUT_LOW);
|
||||
if (IS_ERR(spi->cs_gpiod))
|
||||
return PTR_ERR(spi->cs_gpiod);
|
||||
|
@ -1291,7 +1278,7 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
|
|||
struct bcm2835_spi *bs;
|
||||
int err;
|
||||
|
||||
ctlr = spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs),
|
||||
ctlr = devm_spi_alloc_master(&pdev->dev, ALIGN(sizeof(*bs),
|
||||
dma_get_cache_alignment()));
|
||||
if (!ctlr)
|
||||
return -ENOMEM;
|
||||
|
@ -1312,23 +1299,17 @@ static int bcm2835_spi_probe(struct platform_device *pdev)
|
|||
bs->ctlr = ctlr;
|
||||
|
||||
bs->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(bs->regs)) {
|
||||
err = PTR_ERR(bs->regs);
|
||||
goto out_controller_put;
|
||||
}
|
||||
if (IS_ERR(bs->regs))
|
||||
return PTR_ERR(bs->regs);
|
||||
|
||||
bs->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(bs->clk)) {
|
||||
err = dev_err_probe(&pdev->dev, PTR_ERR(bs->clk),
|
||||
"could not get clk\n");
|
||||
goto out_controller_put;
|
||||
}
|
||||
if (IS_ERR(bs->clk))
|
||||
return dev_err_probe(&pdev->dev, PTR_ERR(bs->clk),
|
||||
"could not get clk\n");
|
||||
|
||||
bs->irq = platform_get_irq(pdev, 0);
|
||||
if (bs->irq <= 0) {
|
||||
err = bs->irq ? bs->irq : -ENODEV;
|
||||
goto out_controller_put;
|
||||
}
|
||||
if (bs->irq <= 0)
|
||||
return bs->irq ? bs->irq : -ENODEV;
|
||||
|
||||
clk_prepare_enable(bs->clk);
|
||||
|
||||
|
@ -1362,8 +1343,6 @@ out_dma_release:
|
|||
bcm2835_dma_release(ctlr, bs);
|
||||
out_clk_disable:
|
||||
clk_disable_unprepare(bs->clk);
|
||||
out_controller_put:
|
||||
spi_controller_put(ctlr);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -494,7 +494,7 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
|
|||
unsigned long clk_hz;
|
||||
int err;
|
||||
|
||||
master = spi_alloc_master(&pdev->dev, sizeof(*bs));
|
||||
master = devm_spi_alloc_master(&pdev->dev, sizeof(*bs));
|
||||
if (!master)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -524,29 +524,25 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
|
|||
|
||||
/* the main area */
|
||||
bs->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||
if (IS_ERR(bs->regs)) {
|
||||
err = PTR_ERR(bs->regs);
|
||||
goto out_master_put;
|
||||
}
|
||||
if (IS_ERR(bs->regs))
|
||||
return PTR_ERR(bs->regs);
|
||||
|
||||
bs->clk = devm_clk_get(&pdev->dev, NULL);
|
||||
if (IS_ERR(bs->clk)) {
|
||||
err = PTR_ERR(bs->clk);
|
||||
dev_err(&pdev->dev, "could not get clk: %d\n", err);
|
||||
goto out_master_put;
|
||||
return err;
|
||||
}
|
||||
|
||||
bs->irq = platform_get_irq(pdev, 0);
|
||||
if (bs->irq <= 0) {
|
||||
err = bs->irq ? bs->irq : -ENODEV;
|
||||
goto out_master_put;
|
||||
}
|
||||
if (bs->irq <= 0)
|
||||
return bs->irq ? bs->irq : -ENODEV;
|
||||
|
||||
/* this also enables the HW block */
|
||||
err = clk_prepare_enable(bs->clk);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "could not prepare clock: %d\n", err);
|
||||
goto out_master_put;
|
||||
return err;
|
||||
}
|
||||
|
||||
/* just checking if the clock returns a sane value */
|
||||
|
@ -581,8 +577,6 @@ static int bcm2835aux_spi_probe(struct platform_device *pdev)
|
|||
|
||||
out_clk_disable:
|
||||
clk_disable_unprepare(bs->clk);
|
||||
out_master_put:
|
||||
spi_master_put(master);
|
||||
return err;
|
||||
}
|
||||
|
||||
|
|
|
@ -1260,12 +1260,14 @@ static int cqspi_probe(struct platform_device *pdev)
|
|||
/* Obtain QSPI reset control */
|
||||
rstc = devm_reset_control_get_optional_exclusive(dev, "qspi");
|
||||
if (IS_ERR(rstc)) {
|
||||
ret = PTR_ERR(rstc);
|
||||
dev_err(dev, "Cannot get QSPI reset.\n");
|
||||
goto probe_reset_failed;
|
||||
}
|
||||
|
||||
rstc_ocp = devm_reset_control_get_optional_exclusive(dev, "qspi-ocp");
|
||||
if (IS_ERR(rstc_ocp)) {
|
||||
ret = PTR_ERR(rstc_ocp);
|
||||
dev_err(dev, "Cannot get QSPI OCP reset.\n");
|
||||
goto probe_reset_failed;
|
||||
}
|
||||
|
|
|
@ -357,11 +357,11 @@ static void dw_spi_irq_setup(struct dw_spi *dws)
|
|||
dw_writel(dws, DW_SPI_TXFTLR, level);
|
||||
dw_writel(dws, DW_SPI_RXFTLR, level - 1);
|
||||
|
||||
dws->transfer_handler = dw_spi_transfer_handler;
|
||||
|
||||
imask = SPI_INT_TXEI | SPI_INT_TXOI | SPI_INT_RXUI | SPI_INT_RXOI |
|
||||
SPI_INT_RXFI;
|
||||
spi_umask_intr(dws, imask);
|
||||
|
||||
dws->transfer_handler = dw_spi_transfer_handler;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -875,7 +875,8 @@ int dw_spi_add_host(struct device *dev, struct dw_spi *dws)
|
|||
master->set_cs = dw_spi_set_cs;
|
||||
master->transfer_one = dw_spi_transfer_one;
|
||||
master->handle_err = dw_spi_handle_err;
|
||||
master->mem_ops = &dws->mem_ops;
|
||||
if (dws->mem_ops.exec_op)
|
||||
master->mem_ops = &dws->mem_ops;
|
||||
master->max_speed_hz = dws->max_freq;
|
||||
master->dev.of_node = dev->of_node;
|
||||
master->dev.fwnode = dev->fwnode;
|
||||
|
|
|
@ -477,7 +477,7 @@ static int fsi_spi_transfer_one_message(struct spi_controller *ctlr,
|
|||
|
||||
rc = fsi_spi_check_mux(ctx->fsi, ctx->dev);
|
||||
if (rc)
|
||||
return rc;
|
||||
goto error;
|
||||
|
||||
list_for_each_entry(transfer, &mesg->transfers, transfer_list) {
|
||||
struct fsi_spi_sequence seq;
|
||||
|
|
|
@ -1080,12 +1080,11 @@ MODULE_DEVICE_TABLE(of, fsl_dspi_dt_ids);
|
|||
#ifdef CONFIG_PM_SLEEP
|
||||
static int dspi_suspend(struct device *dev)
|
||||
{
|
||||
struct spi_controller *ctlr = dev_get_drvdata(dev);
|
||||
struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr);
|
||||
struct fsl_dspi *dspi = dev_get_drvdata(dev);
|
||||
|
||||
if (dspi->irq)
|
||||
disable_irq(dspi->irq);
|
||||
spi_controller_suspend(ctlr);
|
||||
spi_controller_suspend(dspi->ctlr);
|
||||
clk_disable_unprepare(dspi->clk);
|
||||
|
||||
pinctrl_pm_select_sleep_state(dev);
|
||||
|
@ -1095,8 +1094,7 @@ static int dspi_suspend(struct device *dev)
|
|||
|
||||
static int dspi_resume(struct device *dev)
|
||||
{
|
||||
struct spi_controller *ctlr = dev_get_drvdata(dev);
|
||||
struct fsl_dspi *dspi = spi_controller_get_devdata(ctlr);
|
||||
struct fsl_dspi *dspi = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
pinctrl_pm_select_default_state(dev);
|
||||
|
@ -1104,7 +1102,7 @@ static int dspi_resume(struct device *dev)
|
|||
ret = clk_prepare_enable(dspi->clk);
|
||||
if (ret)
|
||||
return ret;
|
||||
spi_controller_resume(ctlr);
|
||||
spi_controller_resume(dspi->ctlr);
|
||||
if (dspi->irq)
|
||||
enable_irq(dspi->irq);
|
||||
|
||||
|
|
|
@ -938,9 +938,6 @@ static int fsl_lpspi_remove(struct platform_device *pdev)
|
|||
spi_controller_get_devdata(controller);
|
||||
|
||||
pm_runtime_disable(fsl_lpspi->dev);
|
||||
|
||||
spi_master_put(controller);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -1659,6 +1659,7 @@ static int spi_imx_probe(struct platform_device *pdev)
|
|||
|
||||
pm_runtime_set_autosuspend_delay(spi_imx->dev, MXC_RPM_TIMEOUT);
|
||||
pm_runtime_use_autosuspend(spi_imx->dev);
|
||||
pm_runtime_get_noresume(spi_imx->dev);
|
||||
pm_runtime_set_active(spi_imx->dev);
|
||||
pm_runtime_enable(spi_imx->dev);
|
||||
|
||||
|
|
|
@ -679,7 +679,7 @@ static int npcm_fiu_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
int id;
|
||||
|
||||
ctrl = spi_alloc_master(dev, sizeof(*fiu));
|
||||
ctrl = devm_spi_alloc_master(dev, sizeof(*fiu));
|
||||
if (!ctrl)
|
||||
return -ENOMEM;
|
||||
|
||||
|
|
|
@ -1001,6 +1001,7 @@ static int nxp_fspi_probe(struct platform_device *pdev)
|
|||
struct resource *res;
|
||||
struct nxp_fspi *f;
|
||||
int ret;
|
||||
u32 reg;
|
||||
|
||||
ctlr = spi_alloc_master(&pdev->dev, sizeof(*f));
|
||||
if (!ctlr)
|
||||
|
@ -1032,6 +1033,12 @@ static int nxp_fspi_probe(struct platform_device *pdev)
|
|||
goto err_put_ctrl;
|
||||
}
|
||||
|
||||
/* Clear potential interrupts */
|
||||
reg = fspi_readl(f, f->iobase + FSPI_INTR);
|
||||
if (reg)
|
||||
fspi_writel(f, reg, f->iobase + FSPI_INTR);
|
||||
|
||||
|
||||
/* find the resources - controller memory mapped space */
|
||||
if (is_acpi_node(f->dev->fwnode))
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 1);
|
||||
|
|
|
@ -821,18 +821,16 @@ static void spi_set_cs(struct spi_device *spi, bool enable)
|
|||
enable = !enable;
|
||||
|
||||
if (spi->cs_gpiod || gpio_is_valid(spi->cs_gpio)) {
|
||||
/*
|
||||
* Honour the SPI_NO_CS flag and invert the enable line, as
|
||||
* active low is default for SPI. Execution paths that handle
|
||||
* polarity inversion in gpiolib (such as device tree) will
|
||||
* enforce active high using the SPI_CS_HIGH resulting in a
|
||||
* double inversion through the code above.
|
||||
*/
|
||||
if (!(spi->mode & SPI_NO_CS)) {
|
||||
if (spi->cs_gpiod)
|
||||
/* polarity handled by gpiolib */
|
||||
gpiod_set_value_cansleep(spi->cs_gpiod,
|
||||
!enable);
|
||||
enable1);
|
||||
else
|
||||
/*
|
||||
* invert the enable line, as active low is
|
||||
* default for SPI.
|
||||
*/
|
||||
gpio_set_value_cansleep(spi->cs_gpio, !enable);
|
||||
}
|
||||
/* Some SPI masters need both GPIO CS & slave_select */
|
||||
|
@ -2001,15 +1999,6 @@ static int of_spi_parse_dt(struct spi_controller *ctlr, struct spi_device *spi,
|
|||
}
|
||||
spi->chip_select = value;
|
||||
|
||||
/*
|
||||
* For descriptors associated with the device, polarity inversion is
|
||||
* handled in the gpiolib, so all gpio chip selects are "active high"
|
||||
* in the logical sense, the gpiolib will invert the line if need be.
|
||||
*/
|
||||
if ((ctlr->use_gpio_descriptors) && ctlr->cs_gpiods &&
|
||||
ctlr->cs_gpiods[spi->chip_select])
|
||||
spi->mode |= SPI_CS_HIGH;
|
||||
|
||||
/* Device speed */
|
||||
if (!of_property_read_u32(nc, "spi-max-frequency", &value))
|
||||
spi->max_speed_hz = value;
|
||||
|
@ -2462,6 +2451,49 @@ struct spi_controller *__spi_alloc_controller(struct device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(__spi_alloc_controller);
|
||||
|
||||
static void devm_spi_release_controller(struct device *dev, void *ctlr)
|
||||
{
|
||||
spi_controller_put(*(struct spi_controller **)ctlr);
|
||||
}
|
||||
|
||||
/**
|
||||
* __devm_spi_alloc_controller - resource-managed __spi_alloc_controller()
|
||||
* @dev: physical device of SPI controller
|
||||
* @size: how much zeroed driver-private data to allocate
|
||||
* @slave: whether to allocate an SPI master (false) or SPI slave (true)
|
||||
* Context: can sleep
|
||||
*
|
||||
* Allocate an SPI controller and automatically release a reference on it
|
||||
* when @dev is unbound from its driver. Drivers are thus relieved from
|
||||
* having to call spi_controller_put().
|
||||
*
|
||||
* The arguments to this function are identical to __spi_alloc_controller().
|
||||
*
|
||||
* Return: the SPI controller structure on success, else NULL.
|
||||
*/
|
||||
struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
|
||||
unsigned int size,
|
||||
bool slave)
|
||||
{
|
||||
struct spi_controller **ptr, *ctlr;
|
||||
|
||||
ptr = devres_alloc(devm_spi_release_controller, sizeof(*ptr),
|
||||
GFP_KERNEL);
|
||||
if (!ptr)
|
||||
return NULL;
|
||||
|
||||
ctlr = __spi_alloc_controller(dev, size, slave);
|
||||
if (ctlr) {
|
||||
*ptr = ctlr;
|
||||
devres_add(dev, ptr);
|
||||
} else {
|
||||
devres_free(ptr);
|
||||
}
|
||||
|
||||
return ctlr;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(__devm_spi_alloc_controller);
|
||||
|
||||
#ifdef CONFIG_OF
|
||||
static int of_spi_get_gpio_numbers(struct spi_controller *ctlr)
|
||||
{
|
||||
|
@ -2798,6 +2830,11 @@ int devm_spi_register_controller(struct device *dev,
|
|||
}
|
||||
EXPORT_SYMBOL_GPL(devm_spi_register_controller);
|
||||
|
||||
static int devm_spi_match_controller(struct device *dev, void *res, void *ctlr)
|
||||
{
|
||||
return *(struct spi_controller **)res == ctlr;
|
||||
}
|
||||
|
||||
static int __unregister(struct device *dev, void *null)
|
||||
{
|
||||
spi_unregister_device(to_spi_device(dev));
|
||||
|
@ -2839,7 +2876,15 @@ void spi_unregister_controller(struct spi_controller *ctlr)
|
|||
list_del(&ctlr->list);
|
||||
mutex_unlock(&board_lock);
|
||||
|
||||
device_unregister(&ctlr->dev);
|
||||
device_del(&ctlr->dev);
|
||||
|
||||
/* Release the last reference on the controller if its driver
|
||||
* has not yet been converted to devm_spi_alloc_master/slave().
|
||||
*/
|
||||
if (!devres_find(ctlr->dev.parent, devm_spi_release_controller,
|
||||
devm_spi_match_controller, ctlr))
|
||||
put_device(&ctlr->dev);
|
||||
|
||||
/* free bus id */
|
||||
mutex_lock(&board_lock);
|
||||
if (found == ctlr)
|
||||
|
@ -3336,12 +3381,15 @@ int spi_setup(struct spi_device *spi)
|
|||
if (!spi->max_speed_hz)
|
||||
spi->max_speed_hz = spi->controller->max_speed_hz;
|
||||
|
||||
mutex_lock(&spi->controller->io_mutex);
|
||||
|
||||
if (spi->controller->setup)
|
||||
status = spi->controller->setup(spi);
|
||||
|
||||
if (spi->controller->auto_runtime_pm && spi->controller->set_cs) {
|
||||
status = pm_runtime_get_sync(spi->controller->dev.parent);
|
||||
if (status < 0) {
|
||||
mutex_unlock(&spi->controller->io_mutex);
|
||||
pm_runtime_put_noidle(spi->controller->dev.parent);
|
||||
dev_err(&spi->controller->dev, "Failed to power device: %d\n",
|
||||
status);
|
||||
|
@ -3363,6 +3411,8 @@ int spi_setup(struct spi_device *spi)
|
|||
spi_set_cs(spi, false);
|
||||
}
|
||||
|
||||
mutex_unlock(&spi->controller->io_mutex);
|
||||
|
||||
if (spi->rt && !spi->controller->rt) {
|
||||
spi->controller->rt = true;
|
||||
spi_set_thread_rt(spi->controller);
|
||||
|
|
|
@ -735,6 +735,25 @@ static inline struct spi_controller *spi_alloc_slave(struct device *host,
|
|||
return __spi_alloc_controller(host, size, true);
|
||||
}
|
||||
|
||||
struct spi_controller *__devm_spi_alloc_controller(struct device *dev,
|
||||
unsigned int size,
|
||||
bool slave);
|
||||
|
||||
static inline struct spi_controller *devm_spi_alloc_master(struct device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
return __devm_spi_alloc_controller(dev, size, false);
|
||||
}
|
||||
|
||||
static inline struct spi_controller *devm_spi_alloc_slave(struct device *dev,
|
||||
unsigned int size)
|
||||
{
|
||||
if (!IS_ENABLED(CONFIG_SPI_SLAVE))
|
||||
return NULL;
|
||||
|
||||
return __devm_spi_alloc_controller(dev, size, true);
|
||||
}
|
||||
|
||||
extern int spi_register_controller(struct spi_controller *ctlr);
|
||||
extern int devm_spi_register_controller(struct device *dev,
|
||||
struct spi_controller *ctlr);
|
||||
|
|
Loading…
Reference in New Issue