aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorVijay Khemka <vijaykhemka@fb.com>2019-05-30 16:36:51 -0400
committerJoel Stanley <joel@jms.id.au>2019-06-17 00:06:51 -0400
commite4272af4247f86ffe65a00619f9d9e8dea496b1d (patch)
tree1bad2c30c980a405ac18d1c60134059ea4cd97a4
parenta188339ca5a396acc588e5851ed7e19f66b0ebd9 (diff)
soc: aspeed: lpc-ctrl: make parameter optional
Making memory-region and flash as optional parameter in device tree if user needs to use these parameter through ioctl then need to define in devicetree. Signed-off-by: Vijay Khemka <vijaykhemka@fb.com> Reviewed-by: Andrew Jeffery <andrew@aj.id.au> Signed-off-by: Joel Stanley <joel@jms.id.au>
-rw-r--r--drivers/soc/aspeed/aspeed-lpc-ctrl.c58
1 files changed, 36 insertions, 22 deletions
diff --git a/drivers/soc/aspeed/aspeed-lpc-ctrl.c b/drivers/soc/aspeed/aspeed-lpc-ctrl.c
index a024f8042259..aca13779764a 100644
--- a/drivers/soc/aspeed/aspeed-lpc-ctrl.c
+++ b/drivers/soc/aspeed/aspeed-lpc-ctrl.c
@@ -68,6 +68,7 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
68 unsigned long param) 68 unsigned long param)
69{ 69{
70 struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file); 70 struct aspeed_lpc_ctrl *lpc_ctrl = file_aspeed_lpc_ctrl(file);
71 struct device *dev = file->private_data;
71 void __user *p = (void __user *)param; 72 void __user *p = (void __user *)param;
72 struct aspeed_lpc_ctrl_mapping map; 73 struct aspeed_lpc_ctrl_mapping map;
73 u32 addr; 74 u32 addr;
@@ -90,6 +91,12 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
90 if (map.window_id != 0) 91 if (map.window_id != 0)
91 return -EINVAL; 92 return -EINVAL;
92 93
94 /* If memory-region is not described in device tree */
95 if (!lpc_ctrl->mem_size) {
96 dev_dbg(dev, "Didn't find reserved memory\n");
97 return -ENXIO;
98 }
99
93 map.size = lpc_ctrl->mem_size; 100 map.size = lpc_ctrl->mem_size;
94 101
95 return copy_to_user(p, &map, sizeof(map)) ? -EFAULT : 0; 102 return copy_to_user(p, &map, sizeof(map)) ? -EFAULT : 0;
@@ -126,9 +133,18 @@ static long aspeed_lpc_ctrl_ioctl(struct file *file, unsigned int cmd,
126 return -EINVAL; 133 return -EINVAL;
127 134
128 if (map.window_type == ASPEED_LPC_CTRL_WINDOW_FLASH) { 135 if (map.window_type == ASPEED_LPC_CTRL_WINDOW_FLASH) {
136 if (!lpc_ctrl->pnor_size) {
137 dev_dbg(dev, "Didn't find host pnor flash\n");
138 return -ENXIO;
139 }
129 addr = lpc_ctrl->pnor_base; 140 addr = lpc_ctrl->pnor_base;
130 size = lpc_ctrl->pnor_size; 141 size = lpc_ctrl->pnor_size;
131 } else if (map.window_type == ASPEED_LPC_CTRL_WINDOW_MEMORY) { 142 } else if (map.window_type == ASPEED_LPC_CTRL_WINDOW_MEMORY) {
143 /* If memory-region is not described in device tree */
144 if (!lpc_ctrl->mem_size) {
145 dev_dbg(dev, "Didn't find reserved memory\n");
146 return -ENXIO;
147 }
132 addr = lpc_ctrl->mem_base; 148 addr = lpc_ctrl->mem_base;
133 size = lpc_ctrl->mem_size; 149 size = lpc_ctrl->mem_size;
134 } else { 150 } else {
@@ -196,17 +212,17 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
196 if (!lpc_ctrl) 212 if (!lpc_ctrl)
197 return -ENOMEM; 213 return -ENOMEM;
198 214
215 /* If flash is described in device tree then store */
199 node = of_parse_phandle(dev->of_node, "flash", 0); 216 node = of_parse_phandle(dev->of_node, "flash", 0);
200 if (!node) { 217 if (!node) {
201 dev_err(dev, "Didn't find host pnor flash node\n"); 218 dev_dbg(dev, "Didn't find host pnor flash node\n");
202 return -ENODEV; 219 } else {
203 } 220 rc = of_address_to_resource(node, 1, &resm);
204 221 of_node_put(node);
205 rc = of_address_to_resource(node, 1, &resm); 222 if (rc) {
206 of_node_put(node); 223 dev_err(dev, "Couldn't address to resource for flash\n");
207 if (rc) { 224 return rc;
208 dev_err(dev, "Couldn't address to resource for flash\n"); 225 }
209 return rc;
210 } 226 }
211 227
212 lpc_ctrl->pnor_size = resource_size(&resm); 228 lpc_ctrl->pnor_size = resource_size(&resm);
@@ -214,22 +230,22 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
214 230
215 dev_set_drvdata(&pdev->dev, lpc_ctrl); 231 dev_set_drvdata(&pdev->dev, lpc_ctrl);
216 232
233 /* If memory-region is described in device tree then store */
217 node = of_parse_phandle(dev->of_node, "memory-region", 0); 234 node = of_parse_phandle(dev->of_node, "memory-region", 0);
218 if (!node) { 235 if (!node) {
219 dev_err(dev, "Didn't find reserved memory\n"); 236 dev_dbg(dev, "Didn't find reserved memory\n");
220 return -EINVAL; 237 } else {
221 } 238 rc = of_address_to_resource(node, 0, &resm);
239 of_node_put(node);
240 if (rc) {
241 dev_err(dev, "Couldn't address to resource for reserved memory\n");
242 return -ENXIO;
243 }
222 244
223 rc = of_address_to_resource(node, 0, &resm); 245 lpc_ctrl->mem_size = resource_size(&resm);
224 of_node_put(node); 246 lpc_ctrl->mem_base = resm.start;
225 if (rc) {
226 dev_err(dev, "Couldn't address to resource for reserved memory\n");
227 return -ENOMEM;
228 } 247 }
229 248
230 lpc_ctrl->mem_size = resource_size(&resm);
231 lpc_ctrl->mem_base = resm.start;
232
233 lpc_ctrl->regmap = syscon_node_to_regmap( 249 lpc_ctrl->regmap = syscon_node_to_regmap(
234 pdev->dev.parent->of_node); 250 pdev->dev.parent->of_node);
235 if (IS_ERR(lpc_ctrl->regmap)) { 251 if (IS_ERR(lpc_ctrl->regmap)) {
@@ -258,8 +274,6 @@ static int aspeed_lpc_ctrl_probe(struct platform_device *pdev)
258 goto err; 274 goto err;
259 } 275 }
260 276
261 dev_info(dev, "Loaded at %pr\n", &resm);
262
263 return 0; 277 return 0;
264 278
265err: 279err: