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

Merge tag 'mvebu-drivers-3.16' of git://git.infradead.org/linux-mvebu into next/drivers

Merge "ARM: mvebu: driver changes for v3.16" from Jason Cooper:

mvebu driver changes for v3.16

- mvebu-devbus
- changes need to add support for the orion5x platform

* tag 'mvebu-drivers-3.16' of git://git.infradead.org/linux-mvebu:
memory: mvebu-devbus: add a devbus, keep-config property
memory: mvebu-devbus: add Orion5x support
memory: mvebu-devbus: split functions
memory: mvebu-devbus: use _SHIFT suffixes instead of _BIT
memory: mvebu-devbus: use ARMADA_ prefix in defines
ARM: orion5x: fix target ID for crypto SRAM window
memory: mvebu-devbus: fix the conversion of the bus width

Signed-off-by: Olof Johansson <olof@lixom.net>

+186 -74
+27 -5
Documentation/devicetree/bindings/memory-controllers/mvebu-devbus.txt
··· 6 6 7 7 Required properties: 8 8 9 - - compatible: Currently only Armada 370/XP SoC are supported, 10 - with this compatible string: 9 + - compatible: Armada 370/XP SoC are supported using the 10 + "marvell,mvebu-devbus" compatible string. 11 11 12 - marvell,mvebu-devbus 12 + Orion5x SoC are supported using the 13 + "marvell,orion-devbus" compatible string. 13 14 14 15 - reg: A resource specifier for the register space. 15 16 This is the base address of a chip select within ··· 23 22 integer values for each chip-select line in use: 24 23 0 <physical address of mapping> <size> 25 24 26 - Mandatory timing properties for child nodes: 25 + Optional properties: 26 + 27 + - devbus,keep-config This property can optionally be used to keep 28 + using the timing parameters set by the 29 + bootloader. It makes all the timing properties 30 + described below unused. 31 + 32 + Timing properties for child nodes: 27 33 28 34 Read parameters: 29 35 ··· 38 30 drive the AD bus after the completion of a device read. 39 31 This prevents contentions on the Device Bus after a read 40 32 cycle from a slow device. 33 + Mandatory, except if devbus,keep-config is used. 41 34 42 - - devbus,bus-width: Defines the bus width (e.g. <16>) 35 + - devbus,bus-width: Defines the bus width, in bits (e.g. <16>). 36 + Mandatory, except if devbus,keep-config is used. 43 37 44 38 - devbus,badr-skew-ps: Defines the time delay from from A[2:0] toggle, 45 39 to read data sample. This parameter is useful for 46 40 synchronous pipelined devices, where the address 47 41 precedes the read data by one or two cycles. 42 + Mandatory, except if devbus,keep-config is used. 48 43 49 44 - devbus,acc-first-ps: Defines the time delay from the negation of 50 45 ALE[0] to the cycle that the first read data is sampled 51 46 by the controller. 47 + Mandatory, except if devbus,keep-config is used. 52 48 53 49 - devbus,acc-next-ps: Defines the time delay between the cycle that 54 50 samples data N and the cycle that samples data N+1 55 51 (in burst accesses). 52 + Mandatory, except if devbus,keep-config is used. 56 53 57 54 - devbus,rd-setup-ps: Defines the time delay between DEV_CSn assertion to 58 55 DEV_OEn assertion. If set to 0 (default), ··· 65 52 This parameter has no affect on <acc-first-ps> parameter 66 53 (no affect on first data sample). Set <rd-setup-ps> 67 54 to a value smaller than <acc-first-ps>. 55 + Mandatory for "marvell,mvebu-devbus" compatible string, 56 + except if devbus,keep-config is used. 68 57 69 58 - devbus,rd-hold-ps: Defines the time between the last data sample to the 70 59 de-assertion of DEV_CSn. If set to 0 (default), ··· 77 62 last data sampled. Also this parameter has no 78 63 affect on <turn-off-ps> parameter. 79 64 Set <rd-hold-ps> to a value smaller than <turn-off-ps>. 65 + Mandatory for "marvell,mvebu-devbus" compatible string, 66 + except if devbus,keep-config is used. 80 67 81 68 Write parameters: 82 69 83 70 - devbus,ale-wr-ps: Defines the time delay from the ALE[0] negation cycle 84 71 to the DEV_WEn assertion. 72 + Mandatory. 85 73 86 74 - devbus,wr-low-ps: Defines the time during which DEV_WEn is active. 87 75 A[2:0] and Data are kept valid as long as DEV_WEn 88 76 is active. This parameter defines the setup time of 89 77 address and data to DEV_WEn rise. 78 + Mandatory. 90 79 91 80 - devbus,wr-high-ps: Defines the time during which DEV_WEn is kept 92 81 inactive (high) between data beats of a burst write. ··· 98 79 <wr-high-ps> - <tick> ps. 99 80 This parameter defines the hold time of address and 100 81 data after DEV_WEn rise. 82 + Mandatory. 101 83 102 84 - devbus,sync-enable: Synchronous device enable. 103 85 1: True 104 86 0: False 87 + Mandatory for "marvell,mvebu-devbus" compatible string, 88 + except if devbus,keep-config is used. 105 89 106 90 An example for an Armada XP GP board, with a 16 MiB NOR device as child 107 91 is showed below. Note that the Device Bus driver is in charge of allocating
+1 -1
arch/arm/mach-orion5x/common.h
··· 21 21 #define ORION_MBUS_DEVBUS_BOOT_ATTR 0x0f 22 22 #define ORION_MBUS_DEVBUS_TARGET(cs) 0x01 23 23 #define ORION_MBUS_DEVBUS_ATTR(cs) (~(1 << cs)) 24 - #define ORION_MBUS_SRAM_TARGET 0x00 24 + #define ORION_MBUS_SRAM_TARGET 0x09 25 25 #define ORION_MBUS_SRAM_ATTR 0x00 26 26 27 27 /*
+158 -68
drivers/memory/mvebu-devbus.c
··· 2 2 * Marvell EBU SoC Device Bus Controller 3 3 * (memory controller for NOR/NAND/SRAM/FPGA devices) 4 4 * 5 - * Copyright (C) 2013 Marvell 5 + * Copyright (C) 2013-2014 Marvell 6 6 * 7 7 * This program is free software: you can redistribute it and/or modify 8 8 * it under the terms of the GNU General Public License as published by ··· 30 30 #include <linux/platform_device.h> 31 31 32 32 /* Register definitions */ 33 - #define DEV_WIDTH_BIT 30 34 - #define BADR_SKEW_BIT 28 35 - #define RD_HOLD_BIT 23 36 - #define ACC_NEXT_BIT 17 37 - #define RD_SETUP_BIT 12 38 - #define ACC_FIRST_BIT 6 33 + #define ARMADA_DEV_WIDTH_SHIFT 30 34 + #define ARMADA_BADR_SKEW_SHIFT 28 35 + #define ARMADA_RD_HOLD_SHIFT 23 36 + #define ARMADA_ACC_NEXT_SHIFT 17 37 + #define ARMADA_RD_SETUP_SHIFT 12 38 + #define ARMADA_ACC_FIRST_SHIFT 6 39 39 40 - #define SYNC_ENABLE_BIT 24 41 - #define WR_HIGH_BIT 16 42 - #define WR_LOW_BIT 8 40 + #define ARMADA_SYNC_ENABLE_SHIFT 24 41 + #define ARMADA_WR_HIGH_SHIFT 16 42 + #define ARMADA_WR_LOW_SHIFT 8 43 43 44 - #define READ_PARAM_OFFSET 0x0 45 - #define WRITE_PARAM_OFFSET 0x4 44 + #define ARMADA_READ_PARAM_OFFSET 0x0 45 + #define ARMADA_WRITE_PARAM_OFFSET 0x4 46 + 47 + #define ORION_RESERVED (0x2 << 30) 48 + #define ORION_BADR_SKEW_SHIFT 28 49 + #define ORION_WR_HIGH_EXT_BIT BIT(27) 50 + #define ORION_WR_HIGH_EXT_MASK 0x8 51 + #define ORION_WR_LOW_EXT_BIT BIT(26) 52 + #define ORION_WR_LOW_EXT_MASK 0x8 53 + #define ORION_ALE_WR_EXT_BIT BIT(25) 54 + #define ORION_ALE_WR_EXT_MASK 0x8 55 + #define ORION_ACC_NEXT_EXT_BIT BIT(24) 56 + #define ORION_ACC_NEXT_EXT_MASK 0x10 57 + #define ORION_ACC_FIRST_EXT_BIT BIT(23) 58 + #define ORION_ACC_FIRST_EXT_MASK 0x10 59 + #define ORION_TURN_OFF_EXT_BIT BIT(22) 60 + #define ORION_TURN_OFF_EXT_MASK 0x8 61 + #define ORION_DEV_WIDTH_SHIFT 20 62 + #define ORION_WR_HIGH_SHIFT 17 63 + #define ORION_WR_HIGH_MASK 0x7 64 + #define ORION_WR_LOW_SHIFT 14 65 + #define ORION_WR_LOW_MASK 0x7 66 + #define ORION_ALE_WR_SHIFT 11 67 + #define ORION_ALE_WR_MASK 0x7 68 + #define ORION_ACC_NEXT_SHIFT 7 69 + #define ORION_ACC_NEXT_MASK 0xF 70 + #define ORION_ACC_FIRST_SHIFT 3 71 + #define ORION_ACC_FIRST_MASK 0xF 72 + #define ORION_TURN_OFF_SHIFT 0 73 + #define ORION_TURN_OFF_MASK 0x7 46 74 47 75 struct devbus_read_params { 48 76 u32 bus_width; ··· 117 89 return 0; 118 90 } 119 91 120 - static int devbus_set_timing_params(struct devbus *devbus, 121 - struct device_node *node) 92 + static int devbus_get_timing_params(struct devbus *devbus, 93 + struct device_node *node, 94 + struct devbus_read_params *r, 95 + struct devbus_write_params *w) 122 96 { 123 - struct devbus_read_params r; 124 - struct devbus_write_params w; 125 - u32 value; 126 97 int err; 127 98 128 - dev_dbg(devbus->dev, "Setting timing parameter, tick is %lu ps\n", 129 - devbus->tick_ps); 130 - 131 - /* Get read timings */ 132 - err = of_property_read_u32(node, "devbus,bus-width", &r.bus_width); 99 + err = of_property_read_u32(node, "devbus,bus-width", &r->bus_width); 133 100 if (err < 0) { 134 101 dev_err(devbus->dev, 135 102 "%s has no 'devbus,bus-width' property\n", 136 103 node->full_name); 137 104 return err; 138 105 } 139 - /* Convert bit width to byte width */ 140 - r.bus_width /= 8; 106 + 107 + /* 108 + * The bus width is encoded into the register as 0 for 8 bits, 109 + * and 1 for 16 bits, so we do the necessary conversion here. 110 + */ 111 + if (r->bus_width == 8) 112 + r->bus_width = 0; 113 + else if (r->bus_width == 16) 114 + r->bus_width = 1; 115 + else { 116 + dev_err(devbus->dev, "invalid bus width %d\n", r->bus_width); 117 + return -EINVAL; 118 + } 141 119 142 120 err = get_timing_param_ps(devbus, node, "devbus,badr-skew-ps", 143 - &r.badr_skew); 121 + &r->badr_skew); 144 122 if (err < 0) 145 123 return err; 146 124 147 125 err = get_timing_param_ps(devbus, node, "devbus,turn-off-ps", 148 - &r.turn_off); 126 + &r->turn_off); 149 127 if (err < 0) 150 128 return err; 151 129 152 130 err = get_timing_param_ps(devbus, node, "devbus,acc-first-ps", 153 - &r.acc_first); 131 + &r->acc_first); 154 132 if (err < 0) 155 133 return err; 156 134 157 135 err = get_timing_param_ps(devbus, node, "devbus,acc-next-ps", 158 - &r.acc_next); 136 + &r->acc_next); 159 137 if (err < 0) 160 138 return err; 161 139 162 - err = get_timing_param_ps(devbus, node, "devbus,rd-setup-ps", 163 - &r.rd_setup); 164 - if (err < 0) 165 - return err; 140 + if (of_device_is_compatible(devbus->dev->of_node, "marvell,mvebu-devbus")) { 141 + err = get_timing_param_ps(devbus, node, "devbus,rd-setup-ps", 142 + &r->rd_setup); 143 + if (err < 0) 144 + return err; 166 145 167 - err = get_timing_param_ps(devbus, node, "devbus,rd-hold-ps", 168 - &r.rd_hold); 169 - if (err < 0) 170 - return err; 146 + err = get_timing_param_ps(devbus, node, "devbus,rd-hold-ps", 147 + &r->rd_hold); 148 + if (err < 0) 149 + return err; 171 150 172 - /* Get write timings */ 173 - err = of_property_read_u32(node, "devbus,sync-enable", 174 - &w.sync_enable); 175 - if (err < 0) { 176 - dev_err(devbus->dev, 177 - "%s has no 'devbus,sync-enable' property\n", 178 - node->full_name); 179 - return err; 151 + err = of_property_read_u32(node, "devbus,sync-enable", 152 + &w->sync_enable); 153 + if (err < 0) { 154 + dev_err(devbus->dev, 155 + "%s has no 'devbus,sync-enable' property\n", 156 + node->full_name); 157 + return err; 158 + } 180 159 } 181 160 182 161 err = get_timing_param_ps(devbus, node, "devbus,ale-wr-ps", 183 - &w.ale_wr); 162 + &w->ale_wr); 184 163 if (err < 0) 185 164 return err; 186 165 187 166 err = get_timing_param_ps(devbus, node, "devbus,wr-low-ps", 188 - &w.wr_low); 167 + &w->wr_low); 189 168 if (err < 0) 190 169 return err; 191 170 192 171 err = get_timing_param_ps(devbus, node, "devbus,wr-high-ps", 193 - &w.wr_high); 172 + &w->wr_high); 194 173 if (err < 0) 195 174 return err; 196 175 176 + return 0; 177 + } 178 + 179 + static void devbus_orion_set_timing_params(struct devbus *devbus, 180 + struct device_node *node, 181 + struct devbus_read_params *r, 182 + struct devbus_write_params *w) 183 + { 184 + u32 value; 185 + 186 + /* 187 + * The hardware designers found it would be a good idea to 188 + * split most of the values in the register into two fields: 189 + * one containing all the low-order bits, and another one 190 + * containing just the high-order bit. For all of those 191 + * fields, we have to split the value into these two parts. 192 + */ 193 + value = (r->turn_off & ORION_TURN_OFF_MASK) << ORION_TURN_OFF_SHIFT | 194 + (r->acc_first & ORION_ACC_FIRST_MASK) << ORION_ACC_FIRST_SHIFT | 195 + (r->acc_next & ORION_ACC_NEXT_MASK) << ORION_ACC_NEXT_SHIFT | 196 + (w->ale_wr & ORION_ALE_WR_MASK) << ORION_ALE_WR_SHIFT | 197 + (w->wr_low & ORION_WR_LOW_MASK) << ORION_WR_LOW_SHIFT | 198 + (w->wr_high & ORION_WR_HIGH_MASK) << ORION_WR_HIGH_SHIFT | 199 + r->bus_width << ORION_DEV_WIDTH_SHIFT | 200 + ((r->turn_off & ORION_TURN_OFF_EXT_MASK) ? ORION_TURN_OFF_EXT_BIT : 0) | 201 + ((r->acc_first & ORION_ACC_FIRST_EXT_MASK) ? ORION_ACC_FIRST_EXT_BIT : 0) | 202 + ((r->acc_next & ORION_ACC_NEXT_EXT_MASK) ? ORION_ACC_NEXT_EXT_BIT : 0) | 203 + ((w->ale_wr & ORION_ALE_WR_EXT_MASK) ? ORION_ALE_WR_EXT_BIT : 0) | 204 + ((w->wr_low & ORION_WR_LOW_EXT_MASK) ? ORION_WR_LOW_EXT_BIT : 0) | 205 + ((w->wr_high & ORION_WR_HIGH_EXT_MASK) ? ORION_WR_HIGH_EXT_BIT : 0) | 206 + (r->badr_skew << ORION_BADR_SKEW_SHIFT) | 207 + ORION_RESERVED; 208 + 209 + writel(value, devbus->base); 210 + } 211 + 212 + static void devbus_armada_set_timing_params(struct devbus *devbus, 213 + struct device_node *node, 214 + struct devbus_read_params *r, 215 + struct devbus_write_params *w) 216 + { 217 + u32 value; 218 + 197 219 /* Set read timings */ 198 - value = r.bus_width << DEV_WIDTH_BIT | 199 - r.badr_skew << BADR_SKEW_BIT | 200 - r.rd_hold << RD_HOLD_BIT | 201 - r.acc_next << ACC_NEXT_BIT | 202 - r.rd_setup << RD_SETUP_BIT | 203 - r.acc_first << ACC_FIRST_BIT | 204 - r.turn_off; 220 + value = r->bus_width << ARMADA_DEV_WIDTH_SHIFT | 221 + r->badr_skew << ARMADA_BADR_SKEW_SHIFT | 222 + r->rd_hold << ARMADA_RD_HOLD_SHIFT | 223 + r->acc_next << ARMADA_ACC_NEXT_SHIFT | 224 + r->rd_setup << ARMADA_RD_SETUP_SHIFT | 225 + r->acc_first << ARMADA_ACC_FIRST_SHIFT | 226 + r->turn_off; 205 227 206 228 dev_dbg(devbus->dev, "read parameters register 0x%p = 0x%x\n", 207 - devbus->base + READ_PARAM_OFFSET, 229 + devbus->base + ARMADA_READ_PARAM_OFFSET, 208 230 value); 209 231 210 - writel(value, devbus->base + READ_PARAM_OFFSET); 232 + writel(value, devbus->base + ARMADA_READ_PARAM_OFFSET); 211 233 212 234 /* Set write timings */ 213 - value = w.sync_enable << SYNC_ENABLE_BIT | 214 - w.wr_low << WR_LOW_BIT | 215 - w.wr_high << WR_HIGH_BIT | 216 - w.ale_wr; 235 + value = w->sync_enable << ARMADA_SYNC_ENABLE_SHIFT | 236 + w->wr_low << ARMADA_WR_LOW_SHIFT | 237 + w->wr_high << ARMADA_WR_HIGH_SHIFT | 238 + w->ale_wr; 217 239 218 240 dev_dbg(devbus->dev, "write parameters register: 0x%p = 0x%x\n", 219 - devbus->base + WRITE_PARAM_OFFSET, 241 + devbus->base + ARMADA_WRITE_PARAM_OFFSET, 220 242 value); 221 243 222 - writel(value, devbus->base + WRITE_PARAM_OFFSET); 223 - 224 - return 0; 244 + writel(value, devbus->base + ARMADA_WRITE_PARAM_OFFSET); 225 245 } 226 246 227 247 static int mvebu_devbus_probe(struct platform_device *pdev) 228 248 { 229 249 struct device *dev = &pdev->dev; 230 250 struct device_node *node = pdev->dev.of_node; 251 + struct devbus_read_params r; 252 + struct devbus_write_params w; 231 253 struct devbus *devbus; 232 254 struct resource *res; 233 255 struct clk *clk; ··· 307 229 rate = clk_get_rate(clk) / 1000; 308 230 devbus->tick_ps = 1000000000 / rate; 309 231 310 - /* Read the device tree node and set the new timing parameters */ 311 - err = devbus_set_timing_params(devbus, node); 312 - if (err < 0) 313 - return err; 232 + dev_dbg(devbus->dev, "Setting timing parameter, tick is %lu ps\n", 233 + devbus->tick_ps); 234 + 235 + if (!of_property_read_bool(node, "devbus,keep-config")) { 236 + /* Read the Device Tree node */ 237 + err = devbus_get_timing_params(devbus, node, &r, &w); 238 + if (err < 0) 239 + return err; 240 + 241 + /* Set the new timing parameters */ 242 + if (of_device_is_compatible(node, "marvell,orion-devbus")) 243 + devbus_orion_set_timing_params(devbus, node, &r, &w); 244 + else 245 + devbus_armada_set_timing_params(devbus, node, &r, &w); 246 + } 314 247 315 248 /* 316 249 * We need to create a child device explicitly from here to ··· 337 248 338 249 static const struct of_device_id mvebu_devbus_of_match[] = { 339 250 { .compatible = "marvell,mvebu-devbus" }, 251 + { .compatible = "marvell,orion-devbus" }, 340 252 {}, 341 253 }; 342 254 MODULE_DEVICE_TABLE(of, mvebu_devbus_of_match);