mirror of
https://github.com/torvalds/linux.git
synced 2026-05-30 01:53:29 +02:00
spi: Merge up fixes
Needed for new development of the pci1xxxx driver.
This commit is contained in:
commit
22a6456727
|
|
@ -5,6 +5,7 @@
|
|||
#include <linux/clk.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/io.h>
|
||||
|
|
|
|||
|
|
@ -297,7 +297,7 @@ int spi_offload_trigger_enable(struct spi_offload *offload,
|
|||
if (trigger->ops->enable) {
|
||||
ret = trigger->ops->enable(trigger, config);
|
||||
if (ret) {
|
||||
if (offload->ops->trigger_disable)
|
||||
if (offload->ops && offload->ops->trigger_disable)
|
||||
offload->ops->trigger_disable(offload);
|
||||
return ret;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -134,6 +134,7 @@ struct omap2_mcspi {
|
|||
size_t max_xfer_len;
|
||||
u32 ref_clk_hz;
|
||||
bool use_multi_mode;
|
||||
bool last_msg_kept_cs;
|
||||
};
|
||||
|
||||
struct omap2_mcspi_cs {
|
||||
|
|
@ -1269,6 +1270,10 @@ static int omap2_mcspi_prepare_message(struct spi_controller *ctlr,
|
|||
* multi-mode is applicable.
|
||||
*/
|
||||
mcspi->use_multi_mode = true;
|
||||
|
||||
if (mcspi->last_msg_kept_cs)
|
||||
mcspi->use_multi_mode = false;
|
||||
|
||||
list_for_each_entry(tr, &msg->transfers, transfer_list) {
|
||||
if (!tr->bits_per_word)
|
||||
bits_per_word = msg->spi->bits_per_word;
|
||||
|
|
@ -1287,18 +1292,19 @@ static int omap2_mcspi_prepare_message(struct spi_controller *ctlr,
|
|||
mcspi->use_multi_mode = false;
|
||||
}
|
||||
|
||||
/* Check if transfer asks to change the CS status after the transfer */
|
||||
if (!tr->cs_change)
|
||||
mcspi->use_multi_mode = false;
|
||||
|
||||
/*
|
||||
* If at least one message is not compatible, switch back to single mode
|
||||
*
|
||||
* The bits_per_word of certain transfer can be different, but it will have no
|
||||
* impact on the signal itself.
|
||||
*/
|
||||
if (!mcspi->use_multi_mode)
|
||||
break;
|
||||
if (list_is_last(&tr->transfer_list, &msg->transfers)) {
|
||||
/* Check if transfer asks to keep the CS status after the whole message */
|
||||
if (tr->cs_change) {
|
||||
mcspi->use_multi_mode = false;
|
||||
mcspi->last_msg_kept_cs = true;
|
||||
} else {
|
||||
mcspi->last_msg_kept_cs = false;
|
||||
}
|
||||
} else {
|
||||
/* Check if transfer asks to change the CS status after the transfer */
|
||||
if (!tr->cs_change)
|
||||
mcspi->use_multi_mode = false;
|
||||
}
|
||||
}
|
||||
|
||||
omap2_mcspi_set_mode(ctlr);
|
||||
|
|
|
|||
|
|
@ -768,7 +768,7 @@ static int pci1xxxx_spi_probe(struct pci_dev *pdev, const struct pci_device_id *
|
|||
PCI_IRQ_ALL_TYPES);
|
||||
if (num_vector < 0) {
|
||||
dev_err(&pdev->dev, "Error allocating MSI vectors\n");
|
||||
return ret;
|
||||
return num_vector;
|
||||
}
|
||||
|
||||
init_completion(&spi_sub_ptr->spi_xfer_done);
|
||||
|
|
|
|||
|
|
@ -804,7 +804,7 @@ static int stm32_ospi_get_resources(struct platform_device *pdev)
|
|||
return ret;
|
||||
}
|
||||
|
||||
ospi->rstc = devm_reset_control_array_get_exclusive(dev);
|
||||
ospi->rstc = devm_reset_control_array_get_exclusive_released(dev);
|
||||
if (IS_ERR(ospi->rstc))
|
||||
return dev_err_probe(dev, PTR_ERR(ospi->rstc),
|
||||
"Can't get reset\n");
|
||||
|
|
@ -936,12 +936,16 @@ static int stm32_ospi_probe(struct platform_device *pdev)
|
|||
if (ret < 0)
|
||||
goto err_pm_enable;
|
||||
|
||||
if (ospi->rstc) {
|
||||
reset_control_assert(ospi->rstc);
|
||||
udelay(2);
|
||||
reset_control_deassert(ospi->rstc);
|
||||
ret = reset_control_acquire(ospi->rstc);
|
||||
if (ret) {
|
||||
dev_err_probe(dev, ret, "Can not acquire reset %d\n", ret);
|
||||
goto err_pm_resume;
|
||||
}
|
||||
|
||||
reset_control_assert(ospi->rstc);
|
||||
udelay(2);
|
||||
reset_control_deassert(ospi->rstc);
|
||||
|
||||
ret = spi_register_controller(ctrl);
|
||||
if (ret) {
|
||||
/* Disable ospi */
|
||||
|
|
@ -987,6 +991,8 @@ static void stm32_ospi_remove(struct platform_device *pdev)
|
|||
if (ospi->dma_chrx)
|
||||
dma_release_channel(ospi->dma_chrx);
|
||||
|
||||
reset_control_release(ospi->rstc);
|
||||
|
||||
pm_runtime_put_sync_suspend(ospi->dev);
|
||||
pm_runtime_force_suspend(ospi->dev);
|
||||
}
|
||||
|
|
@ -997,6 +1003,8 @@ static int __maybe_unused stm32_ospi_suspend(struct device *dev)
|
|||
|
||||
pinctrl_pm_select_sleep_state(dev);
|
||||
|
||||
reset_control_release(ospi->rstc);
|
||||
|
||||
return pm_runtime_force_suspend(ospi->dev);
|
||||
}
|
||||
|
||||
|
|
@ -1016,6 +1024,12 @@ static int __maybe_unused stm32_ospi_resume(struct device *dev)
|
|||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
ret = reset_control_acquire(ospi->rstc);
|
||||
if (ret) {
|
||||
dev_err(dev, "Can not acquire reset\n");
|
||||
return ret;
|
||||
}
|
||||
|
||||
writel_relaxed(ospi->cr_reg, regs_base + OSPI_CR);
|
||||
writel_relaxed(ospi->dcr_reg, regs_base + OSPI_DCR1);
|
||||
pm_runtime_mark_last_busy(ospi->dev);
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user