Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Dinh Nguyen and committed by
Philipp Zabel
27e44646 27dc2fb1

+13 -6
+13 -6
drivers/reset/reset-socfpga.c
··· 24 24 #include <linux/types.h> 25 25 26 26 #define NR_BANKS 4 27 - #define OFFSET_MODRST 0x10 28 27 29 28 struct socfpga_reset_data { 30 29 spinlock_t lock; 31 30 void __iomem *membase; 31 + u32 modrst_offset; 32 32 struct reset_controller_dev rcdev; 33 33 }; 34 34 ··· 45 45 46 46 spin_lock_irqsave(&data->lock, flags); 47 47 48 - reg = readl(data->membase + OFFSET_MODRST + (bank * NR_BANKS)); 49 - writel(reg | BIT(offset), data->membase + OFFSET_MODRST + 48 + reg = readl(data->membase + data->modrst_offset + (bank * NR_BANKS)); 49 + writel(reg | BIT(offset), data->membase + data->modrst_offset + 50 50 (bank * NR_BANKS)); 51 51 spin_unlock_irqrestore(&data->lock, flags); 52 52 ··· 67 67 68 68 spin_lock_irqsave(&data->lock, flags); 69 69 70 - reg = readl(data->membase + OFFSET_MODRST + (bank * NR_BANKS)); 71 - writel(reg & ~BIT(offset), data->membase + OFFSET_MODRST + 70 + reg = readl(data->membase + data->modrst_offset + (bank * NR_BANKS)); 71 + writel(reg & ~BIT(offset), data->membase + data->modrst_offset + 72 72 (bank * NR_BANKS)); 73 73 74 74 spin_unlock_irqrestore(&data->lock, flags); ··· 85 85 int offset = id % BITS_PER_LONG; 86 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 90 return !(reg & BIT(offset)); 91 91 } ··· 100 100 { 101 101 struct socfpga_reset_data *data; 102 102 struct resource *res; 103 + struct device *dev = &pdev->dev; 104 + struct device_node *np = dev->of_node; 103 105 104 106 /* 105 107 * The binding was mainlined without the required property. ··· 121 119 data->membase = devm_ioremap_resource(&pdev->dev, res); 122 120 if (IS_ERR(data->membase)) 123 121 return PTR_ERR(data->membase); 122 + 123 + if (of_property_read_u32(np, "altr,modrst-offset", &data->modrst_offset)) { 124 + dev_warn(dev, "missing altr,modrst-offset property, assuming 0x10!\n"); 125 + data->modrst_offset = 0x10; 126 + } 124 127 125 128 spin_lock_init(&data->lock); 126 129