From 6778948f9de86c3cfaf36725a7c87dcff9ba247f Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Mon, 11 Dec 2023 08:20:59 +0000 Subject: [PATCH] kernel_5.10 no rt --- kernel/drivers/spi/spi-rockchip.c | 31 ++++++++++++++++++++++++++++++- 1 files changed, 30 insertions(+), 1 deletions(-) diff --git a/kernel/drivers/spi/spi-rockchip.c b/kernel/drivers/spi/spi-rockchip.c index d6cc6de..b627663 100644 --- a/kernel/drivers/spi/spi-rockchip.c +++ b/kernel/drivers/spi/spi-rockchip.c @@ -221,6 +221,7 @@ bool slave_aborted; bool cs_inactive; /* spi slave tansmition stop when cs inactive */ bool cs_high_supported; /* native CS supports active-high polarity */ + struct gpio_desc *ready; /* spi slave transmission ready */ struct spi_transfer *xfer; /* Store xfer temporarily */ phys_addr_t base_addr_phy; @@ -859,8 +860,17 @@ ret = rockchip_spi_prepare_irq(rs, ctlr, xfer); } + if (rs->ready) { + gpiod_set_value(rs->ready, 0); + udelay(1); + gpiod_set_value(rs->ready, 1); + } + if (ret > 0) ret = rockchip_spi_transfer_wait(ctlr, xfer); + + if (rs->ready) + gpiod_set_value(rs->ready, 0); return ret; } @@ -969,6 +979,7 @@ bool slave_mode; struct pinctrl *pinctrl = NULL; const struct rockchip_spi_quirks *quirks_cfg; + u32 val; slave_mode = of_property_read_bool(np, "spi-slave"); @@ -982,6 +993,7 @@ if (!ctlr) return -ENOMEM; + ctlr->rt = device_property_read_bool(&pdev->dev, "rockchip,rt"); platform_set_drvdata(pdev, ctlr); rs = spi_controller_get_devdata(ctlr); @@ -1095,6 +1107,13 @@ if (quirks_cfg) rs->max_baud_div_in_cpha = quirks_cfg->max_baud_div_in_cpha; + if (!device_property_read_u32(&pdev->dev, "rockchip,autosuspend-delay-ms", &val)) { + if (val > 0) { + pm_runtime_set_autosuspend_delay(&pdev->dev, val); + pm_runtime_use_autosuspend(&pdev->dev); + } + } + pm_runtime_set_active(&pdev->dev); pm_runtime_enable(&pdev->dev); @@ -1175,6 +1194,8 @@ rs->cs_inactive = false; break; } + if (device_property_read_bool(&pdev->dev, "rockchip,cs-inactive-disable")) + rs->cs_inactive = false; pinctrl = devm_pinctrl_get(&pdev->dev); if (!IS_ERR(pinctrl)) { @@ -1183,6 +1204,13 @@ dev_warn(&pdev->dev, "no high_speed pinctrl state\n"); rs->high_speed_state = NULL; } + } + + rs->ready = devm_gpiod_get_optional(&pdev->dev, "ready", GPIOD_OUT_HIGH); + if (IS_ERR(rs->ready)) { + ret = dev_err_probe(&pdev->dev, PTR_ERR(rs->ready), + "invalid ready-gpios property in node\n"); + goto err_free_dma_rx; } ret = devm_spi_register_controller(&pdev->dev, ctlr); @@ -1207,7 +1235,8 @@ dev_info(&pdev->dev, "register misc device %s\n", misc_name); } - dev_info(rs->dev, "probed, poll=%d, rsd=%d\n", rs->poll, rs->rsd); + dev_info(rs->dev, "probed, poll=%d, rsd=%d, cs-inactive=%d, ready=%d\n", + rs->poll, rs->rsd, rs->cs_inactive, rs->ready ? 1 : 0); return 0; -- Gitblit v1.6.2