summaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/denali_dt.c
diff options
context:
space:
mode:
authorMasahiro Yamada <yamada.masahiro@socionext.com>2017-03-23 05:07:07 +0900
committerBoris Brezillon <boris.brezillon@free-electrons.com>2017-03-24 09:51:38 +0100
commitbe72a4aa8ec1c13a55708bd0285106a5020ff72f (patch)
tree0c56f3f0285834e90dcae6c2e86fb7b6a5464b5c /drivers/mtd/nand/denali_dt.c
parent1aded58a27f253f399dcd5746417e684c92ccd7d (diff)
downloadop-kernel-dev-be72a4aa8ec1c13a55708bd0285106a5020ff72f.zip
op-kernel-dev-be72a4aa8ec1c13a55708bd0285106a5020ff72f.tar.gz
mtd: nand: denali: introduce capability flag
The Denali NAND controller IP has various customizable features. SoC vendors can choose desired functions when a delivery RTL is created. It means there are several variants for this IP. For example, the Intel version is equipped with 32bit DMA, whereas the IP for UniPhier SoC family with 64bit DMA. This driver was originally written for some Intel platforms with Intel specific things hard-coded. What is worse, the revision register of this IP does not work to distinguish such features. We need to do something to make the driver available for other SoCs. Let's introduce a caps member to the denali_nand_info structure to switch on/off various features. Also, add struct denali_dt_data to store the capability associated with compatible string. Boris suggested this approach in discussion [1] instead of a new DT property for every feature. [1] https://lkml.org/lkml/2016/3/29/142 Signed-off-by: Masahiro Yamada <yamada.masahiro@socionext.com> Signed-off-by: Boris Brezillon <boris.brezillon@free-electrons.com>
Diffstat (limited to 'drivers/mtd/nand/denali_dt.c')
-rw-r--r--drivers/mtd/nand/denali_dt.c18
1 files changed, 9 insertions, 9 deletions
diff --git a/drivers/mtd/nand/denali_dt.c b/drivers/mtd/nand/denali_dt.c
index 5607fcd..293ddb8 100644
--- a/drivers/mtd/nand/denali_dt.c
+++ b/drivers/mtd/nand/denali_dt.c
@@ -29,6 +29,10 @@ struct denali_dt {
struct clk *clk;
};
+struct denali_dt_data {
+ unsigned int caps;
+};
+
static const struct of_device_id denali_nand_dt_ids[] = {
{ .compatible = "denali,denali-nand-dt" },
{ /* sentinel */ }
@@ -42,23 +46,19 @@ static int denali_dt_probe(struct platform_device *ofdev)
{
struct resource *denali_reg, *nand_data;
struct denali_dt *dt;
+ const struct denali_dt_data *data;
struct denali_nand_info *denali;
int ret;
- const struct of_device_id *of_id;
-
- of_id = of_match_device(denali_nand_dt_ids, &ofdev->dev);
- if (of_id) {
- ofdev->id_entry = of_id->data;
- } else {
- pr_err("Failed to find the right device id.\n");
- return -ENOMEM;
- }
dt = devm_kzalloc(&ofdev->dev, sizeof(*dt), GFP_KERNEL);
if (!dt)
return -ENOMEM;
denali = &dt->denali;
+ data = of_device_get_match_data(&ofdev->dev);
+ if (data)
+ denali->caps = data->caps;
+
denali->platform = DT;
denali->dev = &ofdev->dev;
denali->irq = platform_get_irq(ofdev, 0);
OpenPOWER on IntegriCloud