@@ -2,10 +2,12 @@
//
// Copyright 2013 Freescale Semiconductor, Inc.
// Copyright 2020 NXP
+// Copyright 2020 Puresoftware Ltd.
//
// Freescale DSPI driver
// This file contains a driver for the Freescale DSPI
+#include <linux/acpi.h>
#include <linux/clk.h>
#include <linux/delay.h>
#include <linux/dmaengine.h>
@@ -1070,6 +1072,12 @@ static void dspi_cleanup(struct spi_device *spi)
kfree(chip);
}
+static const struct acpi_device_id fsl_dspi_acpi_ids[] = {
+ { "NXP0005", .driver_data = (kernel_ulong_t)&devtype_data[LS2085A], },
+ {},
+};
+MODULE_DEVICE_TABLE(acpi, fsl_dspi_acpi_ids);
+
static const struct of_device_id fsl_dspi_dt_ids[] = {
{
.compatible = "fsl,vf610-dspi",
@@ -1272,6 +1280,7 @@ static int dspi_probe(struct platform_device *pdev)
struct resource *res;
void __iomem *base;
bool big_endian;
+ u32 clk_rate;
ctlr = spi_alloc_master(&pdev->dev, sizeof(struct fsl_dspi));
if (!ctlr)
@@ -1300,20 +1309,41 @@ static int dspi_probe(struct platform_device *pdev)
big_endian = true;
} else {
- ret = of_property_read_u32(np, "spi-num-chipselects", &cs_num);
+ if (is_acpi_node(pdev->dev.fwnode))
+ ret = device_property_read_u32(&pdev->dev,
+ "spi-num-chipselects", &cs_num);
+ else
+ ret = of_property_read_u32(np,
+ "spi-num-chipselects", &cs_num);
if (ret < 0) {
dev_err(&pdev->dev, "can't get spi-num-chipselects\n");
goto out_ctlr_put;
}
ctlr->num_chipselect = cs_num;
- of_property_read_u32(np, "bus-num", &bus_num);
+ if (is_acpi_node(pdev->dev.fwnode)) {
+ ret = device_property_read_u32(&pdev->dev,
+ "bus-num", &bus_num);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "can't get bus-num\n");
+ goto out_ctlr_put;
+ }
+ } else {
+ of_property_read_u32(np, "bus-num", &bus_num);
+ }
ctlr->bus_num = bus_num;
- if (of_property_read_bool(np, "spi-slave"))
- ctlr->slave = true;
+ if (!is_acpi_node(pdev->dev.fwnode)) {
+ if (of_property_read_bool(np, "spi-slave"))
+ ctlr->slave = true;
+ }
+
+ if (is_acpi_node(pdev->dev.fwnode))
+ dspi->devtype_data = device_get_match_data(&pdev->dev);
+ else
+ dspi->devtype_data =
+ of_device_get_match_data(&pdev->dev);
- dspi->devtype_data = of_device_get_match_data(&pdev->dev);
if (!dspi->devtype_data) {
dev_err(&pdev->dev, "can't get devtype_data\n");
ret = -EFAULT;
@@ -1367,15 +1397,18 @@ static int dspi_probe(struct platform_device *pdev)
}
}
- dspi->clk = devm_clk_get(&pdev->dev, "dspi");
- if (IS_ERR(dspi->clk)) {
- ret = PTR_ERR(dspi->clk);
- dev_err(&pdev->dev, "unable to get clock\n");
- goto out_ctlr_put;
+ if (!is_acpi_node(pdev->dev.fwnode)) {
+ dspi->clk = devm_clk_get(&pdev->dev, "dspi");
+ if (IS_ERR(dspi->clk)) {
+ ret = PTR_ERR(dspi->clk);
+ dev_err(&pdev->dev, "unable to get clock\n");
+ goto out_ctlr_put;
+ }
+
+ ret = clk_prepare_enable(dspi->clk);
+ if (ret)
+ goto out_ctlr_put;
}
- ret = clk_prepare_enable(dspi->clk);
- if (ret)
- goto out_ctlr_put;
ret = dspi_init(dspi);
if (ret)
@@ -1408,8 +1441,21 @@ static int dspi_probe(struct platform_device *pdev)
}
}
- ctlr->max_speed_hz =
- clk_get_rate(dspi->clk) / dspi->devtype_data->max_clock_factor;
+ if (is_acpi_node(pdev->dev.fwnode)) {
+ ret = device_property_read_u32(&pdev->dev,
+ "clock-frequency", &clk_rate);
+ if (ret < 0) {
+ dev_err(&pdev->dev, "can't get clock-frequency\n");
+ goto out_ctlr_put;
+ }
+
+ ctlr->max_speed_hz =
+ clk_rate / dspi->devtype_data->max_clock_factor;
+ } else {
+ clk_rate = clk_get_rate(dspi->clk);
+ ctlr->max_speed_hz =
+ clk_rate / dspi->devtype_data->max_clock_factor;
+ }
if (dspi->devtype_data->trans_mode != DSPI_DMA_MODE)
ctlr->ptp_sts_supported = true;
@@ -1465,13 +1511,14 @@ static void dspi_shutdown(struct platform_device *pdev)
}
static struct platform_driver fsl_dspi_driver = {
- .driver.name = DRIVER_NAME,
- .driver.of_match_table = fsl_dspi_dt_ids,
- .driver.owner = THIS_MODULE,
- .driver.pm = &dspi_pm,
- .probe = dspi_probe,
- .remove = dspi_remove,
- .shutdown = dspi_shutdown,
+ .driver.name = DRIVER_NAME,
+ .driver.of_match_table = fsl_dspi_dt_ids,
+ .driver.acpi_match_table = ACPI_PTR(fsl_dspi_acpi_ids),
+ .driver.owner = THIS_MODULE,
+ .driver.pm = &dspi_pm,
+ .probe = dspi_probe,
+ .remove = dspi_remove,
+ .shutdown = dspi_shutdown,
};
module_platform_driver(fsl_dspi_driver);