Skip to content
Permalink
Browse files
spi: spi-fsl-dspi: Add ACPI support
Currently fsl DSPI driver has support of DT only. Adding ACPI
support to the drive so that it can be used by UEFI firmware
boot in ACPI mode. This driver will be probed if any firmware
will expose HID "NXP0005" in DSDT table.

Signed-off-by: tanveer <tanveer.alam@puresoftware.com>
Signed-off-by: kuldip dwivedi <kuldip.dwivedi@puresoftware.com>
  • Loading branch information
kuldipdwivedi12 authored and intel-lab-lkp committed Aug 21, 2020
1 parent 04ffc5b commit 00b7c46d88c9150bd8225fce2b7b95e186514e10
Showing 1 changed file with 69 additions and 22 deletions.
@@ -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);

0 comments on commit 00b7c46

Please sign in to comment.