diff options
author | Dinh Nguyen <dinguyen@opensource.altera.com> | 2015-07-31 17:03:10 -0400 |
---|---|---|
committer | Philipp Zabel <p.zabel@pengutronix.de> | 2015-08-03 07:13:59 -0400 |
commit | 27e44646dc0083c931b71bbb8e179aeb38010d31 (patch) | |
tree | 26cbe20244e4bd706de9daf7f9d0d223a984431a /drivers/reset/reset-socfpga.c | |
parent | 27dc2fb18fe814fab0a5035859c77b279cdaec80 (diff) |
reset: socfpga: Update reset-socfpga to read the altr,modrst-offset property
In order for the Arria10 to be able to re-use the reset driver for SoCFPGA
Cyclone5/Arria5, we need to read the 'altr,modrst-offset' property from the
device tree entry. The 'altr,modrst-offset' property is the first register
into the reset manager that is used for bringing peripherals out of reset.
The driver assumes a modrst-offset of 0x10 in order to support legacy
Cyclone5/Arria5 hardware.
Signed-off-by: Dinh Nguyen <dinguyen@opensource.altera.com>
Diffstat (limited to 'drivers/reset/reset-socfpga.c')
-rw-r--r-- | drivers/reset/reset-socfpga.c | 19 |
1 files changed, 13 insertions, 6 deletions
diff --git a/drivers/reset/reset-socfpga.c b/drivers/reset/reset-socfpga.c index 0a8def35ea2e..1a6c5d66c83b 100644 --- a/drivers/reset/reset-socfpga.c +++ b/drivers/reset/reset-socfpga.c | |||
@@ -24,11 +24,11 @@ | |||
24 | #include <linux/types.h> | 24 | #include <linux/types.h> |
25 | 25 | ||
26 | #define NR_BANKS 4 | 26 | #define NR_BANKS 4 |
27 | #define OFFSET_MODRST 0x10 | ||
28 | 27 | ||
29 | struct socfpga_reset_data { | 28 | struct socfpga_reset_data { |
30 | spinlock_t lock; | 29 | spinlock_t lock; |
31 | void __iomem *membase; | 30 | void __iomem *membase; |
31 | u32 modrst_offset; | ||
32 | struct reset_controller_dev rcdev; | 32 | struct reset_controller_dev rcdev; |
33 | }; | 33 | }; |
34 | 34 | ||
@@ -45,8 +45,8 @@ static int socfpga_reset_assert(struct reset_controller_dev *rcdev, | |||
45 | 45 | ||
46 | spin_lock_irqsave(&data->lock, flags); | 46 | spin_lock_irqsave(&data->lock, flags); |
47 | 47 | ||
48 | reg = readl(data->membase + OFFSET_MODRST + (bank * NR_BANKS)); | 48 | reg = readl(data->membase + data->modrst_offset + (bank * NR_BANKS)); |
49 | writel(reg | BIT(offset), data->membase + OFFSET_MODRST + | 49 | writel(reg | BIT(offset), data->membase + data->modrst_offset + |
50 | (bank * NR_BANKS)); | 50 | (bank * NR_BANKS)); |
51 | spin_unlock_irqrestore(&data->lock, flags); | 51 | spin_unlock_irqrestore(&data->lock, flags); |
52 | 52 | ||
@@ -67,8 +67,8 @@ static int socfpga_reset_deassert(struct reset_controller_dev *rcdev, | |||
67 | 67 | ||
68 | spin_lock_irqsave(&data->lock, flags); | 68 | spin_lock_irqsave(&data->lock, flags); |
69 | 69 | ||
70 | reg = readl(data->membase + OFFSET_MODRST + (bank * NR_BANKS)); | 70 | reg = readl(data->membase + data->modrst_offset + (bank * NR_BANKS)); |
71 | writel(reg & ~BIT(offset), data->membase + OFFSET_MODRST + | 71 | writel(reg & ~BIT(offset), data->membase + data->modrst_offset + |
72 | (bank * NR_BANKS)); | 72 | (bank * NR_BANKS)); |
73 | 73 | ||
74 | spin_unlock_irqrestore(&data->lock, flags); | 74 | spin_unlock_irqrestore(&data->lock, flags); |
@@ -85,7 +85,7 @@ static int socfpga_reset_status(struct reset_controller_dev *rcdev, | |||
85 | int offset = id % BITS_PER_LONG; | 85 | int offset = id % BITS_PER_LONG; |
86 | u32 reg; | 86 | u32 reg; |
87 | 87 | ||
88 | reg = readl(data->membase + OFFSET_MODRST + (bank * NR_BANKS)); | 88 | reg = readl(data->membase + data->modrst_offset + (bank * NR_BANKS)); |
89 | 89 | ||
90 | return !(reg & BIT(offset)); | 90 | return !(reg & BIT(offset)); |
91 | } | 91 | } |
@@ -100,6 +100,8 @@ static int socfpga_reset_probe(struct platform_device *pdev) | |||
100 | { | 100 | { |
101 | struct socfpga_reset_data *data; | 101 | struct socfpga_reset_data *data; |
102 | struct resource *res; | 102 | struct resource *res; |
103 | struct device *dev = &pdev->dev; | ||
104 | struct device_node *np = dev->of_node; | ||
103 | 105 | ||
104 | /* | 106 | /* |
105 | * The binding was mainlined without the required property. | 107 | * The binding was mainlined without the required property. |
@@ -120,6 +122,11 @@ static int socfpga_reset_probe(struct platform_device *pdev) | |||
120 | if (IS_ERR(data->membase)) | 122 | if (IS_ERR(data->membase)) |
121 | return PTR_ERR(data->membase); | 123 | return PTR_ERR(data->membase); |
122 | 124 | ||
125 | if (of_property_read_u32(np, "altr,modrst-offset", &data->modrst_offset)) { | ||
126 | dev_warn(dev, "missing altr,modrst-offset property, assuming 0x10!\n"); | ||
127 | data->modrst_offset = 0x10; | ||
128 | } | ||
129 | |||
123 | spin_lock_init(&data->lock); | 130 | spin_lock_init(&data->lock); |
124 | 131 | ||
125 | data->rcdev.owner = THIS_MODULE; | 132 | data->rcdev.owner = THIS_MODULE; |