diff options
| author | Olof Johansson <olof@lixom.net> | 2019-06-25 08:43:16 -0400 |
|---|---|---|
| committer | Olof Johansson <olof@lixom.net> | 2019-06-25 08:43:16 -0400 |
| commit | 0aa447e5ce1463243ae83071de7b732d8075944e (patch) | |
| tree | 210d3c0d5d86578737a19219bf94f50048956d39 | |
| parent | 761d3d22fb74232d2a5a2899358ff1bab94d6fa0 (diff) | |
| parent | c8a3b9b50d8331528fc8d03aadd1fec3d60362d7 (diff) | |
Merge tag 'aspeed-5.3-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/aspeed into arm/drivers
ASPEED SoC updates for 5.3
LPC control driver changes and a fix.
* tag 'aspeed-5.3-soc' of git://git.kernel.org/pub/scm/linux/kernel/git/joel/aspeed:
soc: aspeed: lpc-ctrl: Fix probe error handling
soc: aspeed: lpc-ctrl: make parameter optional
Signed-off-by: Olof Johansson <olof@lixom.net>
| -rw-r--r-- | drivers/soc/aspeed/aspeed-lpc-ctrl.c | 61 |
1 files changed, 38 insertions, 23 deletions
diff --git a/drivers/soc/aspeed/aspeed-lpc-ctrl.c b/drivers/soc/aspeed/aspeed-lpc-ctrl.c index 61276ec692f8..01ed21e8bfee 100644 --- a/drivers/soc/aspeed/aspeed-lpc-ctrl.c +++ b/drivers/soc/aspeed/aspeed-lpc-ctrl.c | |||
| @@ -64,6 +64,7 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd, | |||
| 64 | unsigned long param) | 64 | unsigned long param) |
| 65 | { | 65 | { |
| 66 | struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file); | 66 | struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file); |
| 67 | struct device *dev = file->private_data; | ||
| 67 | void __user *p = (void __user *)param; | 68 | void __user *p = (void __user *)param; |
| 68 | struct aspeed_lpc_ctrl_mapping map; | 69 | struct aspeed_lpc_ctrl_mapping map; |
| 69 | u32 addr; | 70 | u32 addr; |
| @@ -86,6 +87,12 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd, | |||
| 86 | if (map.window_id != 0) | 87 | if (map.window_id != 0) |
| 87 | return -EINVAL; | 88 | return -EINVAL; |
| 88 | 89 | ||
| 90 | /* If memory-region is not described in device tree */ | ||
| 91 | if (!lpc_ctrl->mem_size) { | ||
| 92 | dev_dbg(dev, "Didn't find reserved memory\n"); | ||
| 93 | return -ENXIO; | ||
| 94 | } | ||
| 95 | |||
| 89 | map.size = lpc_ctrl->mem_size; | 96 | map.size = lpc_ctrl->mem_size; |
| 90 | 97 | ||
| 91 | return copy_to_user(p, &map, sizeof(map)) ? -EFAULT : 0; | 98 | return copy_to_user(p, &map, sizeof(map)) ? -EFAULT : 0; |
| @@ -122,9 +129,18 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd, | |||
| 122 | return -EINVAL; | 129 | return -EINVAL; |
| 123 | 130 | ||
| 124 | if (map.window_type == ASPEED_LPC_CTRL_WINDOW_FLASH) { | 131 | if (map.window_type == ASPEED_LPC_CTRL_WINDOW_FLASH) { |
| 132 | if (!lpc_ctrl->pnor_size) { | ||
| 133 | dev_dbg(dev, "Didn't find host pnor flash\n"); | ||
| 134 | return -ENXIO; | ||
| 135 | } | ||
| 125 | addr = lpc_ctrl->pnor_base; | 136 | addr = lpc_ctrl->pnor_base; |
| 126 | size = lpc_ctrl->pnor_size; | 137 | size = lpc_ctrl->pnor_size; |
| 127 | } else if (map.window_type == ASPEED_LPC_CTRL_WINDOW_MEMORY) { | 138 | } else if (map.window_type == ASPEED_LPC_CTRL_WINDOW_MEMORY) { |
| 139 | /* If memory-region is not described in device tree */ | ||
| 140 | if (!lpc_ctrl->mem_size) { | ||
| 141 | dev_dbg(dev, "Didn't find reserved memory\n"); | ||
| 142 | return -ENXIO; | ||
| 143 | } | ||
| 128 | addr = lpc_ctrl->mem_base; | 144 | addr = lpc_ctrl->mem_base; |
| 129 | size = lpc_ctrl->mem_size; | 145 | size = lpc_ctrl->mem_size; |
| 130 | } else { | 146 | } else { |
| @@ -192,40 +208,41 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) | |||
| 192 | if (!lpc_ctrl) | 208 | if (!lpc_ctrl) |
| 193 | return -ENOMEM; | 209 | return -ENOMEM; |
| 194 | 210 | ||
| 211 | /* If flash is described in device tree then store */ | ||
| 195 | node = of_parse_phandle(dev->of_node, "flash", 0); | 212 | node = of_parse_phandle(dev->of_node, "flash", 0); |
| 196 | if (!node) { | 213 | if (!node) { |
| 197 | dev_err(dev, "Didn't find host pnor flash node\n"); | 214 | dev_dbg(dev, "Didn't find host pnor flash node\n"); |
| 198 | return -ENODEV; | 215 | } else { |
| 199 | } | 216 | rc = of_address_to_resource(node, 1, &resm); |
| 217 | of_node_put(node); | ||
| 218 | if (rc) { | ||
| 219 | dev_err(dev, "Couldn't address to resource for flash\n"); | ||
| 220 | return rc; | ||
| 221 | } | ||
| 200 | 222 | ||
| 201 | rc = of_address_to_resource(node, 1, &resm); | 223 | lpc_ctrl->pnor_size = resource_size(&resm); |
| 202 | of_node_put(node); | 224 | lpc_ctrl->pnor_base = resm.start; |
| 203 | if (rc) { | ||
| 204 | dev_err(dev, "Couldn't address to resource for flash\n"); | ||
| 205 | return rc; | ||
| 206 | } | 225 | } |
| 207 | 226 | ||
| 208 | lpc_ctrl->pnor_size = resource_size(&resm); | ||
| 209 | lpc_ctrl->pnor_base = resm.start; | ||
| 210 | 227 | ||
| 211 | dev_set_drvdata(&pdev->dev, lpc_ctrl); | 228 | dev_set_drvdata(&pdev->dev, lpc_ctrl); |
| 212 | 229 | ||
| 230 | /* If memory-region is described in device tree then store */ | ||
| 213 | node = of_parse_phandle(dev->of_node, "memory-region", 0); | 231 | node = of_parse_phandle(dev->of_node, "memory-region", 0); |
| 214 | if (!node) { | 232 | if (!node) { |
| 215 | dev_err(dev, "Didn't find reserved memory\n"); | 233 | dev_dbg(dev, "Didn't find reserved memory\n"); |
| 216 | return -EINVAL; | 234 | } else { |
| 217 | } | 235 | rc = of_address_to_resource(node, 0, &resm); |
| 236 | of_node_put(node); | ||
| 237 | if (rc) { | ||
| 238 | dev_err(dev, "Couldn't address to resource for reserved memory\n"); | ||
| 239 | return -ENXIO; | ||
| 240 | } | ||
| 218 | 241 | ||
| 219 | rc = of_address_to_resource(node, 0, &resm); | 242 | lpc_ctrl->mem_size = resource_size(&resm); |
| 220 | of_node_put(node); | 243 | lpc_ctrl->mem_base = resm.start; |
| 221 | if (rc) { | ||
| 222 | dev_err(dev, "Couldn't address to resource for reserved memory\n"); | ||
| 223 | return -ENOMEM; | ||
| 224 | } | 244 | } |
| 225 | 245 | ||
| 226 | lpc_ctrl->mem_size = resource_size(&resm); | ||
| 227 | lpc_ctrl->mem_base = resm.start; | ||
| 228 | |||
| 229 | lpc_ctrl->regmap = syscon_node_to_regmap( | 246 | lpc_ctrl->regmap = syscon_node_to_regmap( |
| 230 | pdev->dev.parent->of_node); | 247 | pdev->dev.parent->of_node); |
| 231 | if (IS_ERR(lpc_ctrl->regmap)) { | 248 | if (IS_ERR(lpc_ctrl->regmap)) { |
| @@ -254,8 +271,6 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev) | |||
| 254 | goto err; | 271 | goto err; |
| 255 | } | 272 | } |
| 256 | 273 | ||
| 257 | dev_info(dev, "Loaded at %pr\n", &resm); | ||
| 258 | |||
| 259 | return 0; | 274 | return 0; |
| 260 | 275 | ||
| 261 | err: | 276 | err: |
