diff options
Diffstat (limited to 'drivers/fpga/zynq-fpga.c')
-rw-r--r-- | drivers/fpga/zynq-fpga.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/drivers/fpga/zynq-fpga.c b/drivers/fpga/zynq-fpga.c index c2fb4120bd62..1812bf7614e1 100644 --- a/drivers/fpga/zynq-fpga.c +++ b/drivers/fpga/zynq-fpga.c | |||
@@ -118,7 +118,6 @@ | |||
118 | #define FPGA_RST_NONE_MASK 0x0 | 118 | #define FPGA_RST_NONE_MASK 0x0 |
119 | 119 | ||
120 | struct zynq_fpga_priv { | 120 | struct zynq_fpga_priv { |
121 | struct device *dev; | ||
122 | int irq; | 121 | int irq; |
123 | struct clk *clk; | 122 | struct clk *clk; |
124 | 123 | ||
@@ -175,7 +174,8 @@ static irqreturn_t zynq_fpga_isr(int irq, void *data) | |||
175 | return IRQ_HANDLED; | 174 | return IRQ_HANDLED; |
176 | } | 175 | } |
177 | 176 | ||
178 | static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, u32 flags, | 177 | static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, |
178 | struct fpga_image_info *info, | ||
179 | const char *buf, size_t count) | 179 | const char *buf, size_t count) |
180 | { | 180 | { |
181 | struct zynq_fpga_priv *priv; | 181 | struct zynq_fpga_priv *priv; |
@@ -189,7 +189,7 @@ static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, u32 flags, | |||
189 | return err; | 189 | return err; |
190 | 190 | ||
191 | /* don't globally reset PL if we're doing partial reconfig */ | 191 | /* don't globally reset PL if we're doing partial reconfig */ |
192 | if (!(flags & FPGA_MGR_PARTIAL_RECONFIG)) { | 192 | if (!(info->flags & FPGA_MGR_PARTIAL_RECONFIG)) { |
193 | /* assert AXI interface resets */ | 193 | /* assert AXI interface resets */ |
194 | regmap_write(priv->slcr, SLCR_FPGA_RST_CTRL_OFFSET, | 194 | regmap_write(priv->slcr, SLCR_FPGA_RST_CTRL_OFFSET, |
195 | FPGA_RST_ALL_MASK); | 195 | FPGA_RST_ALL_MASK); |
@@ -217,7 +217,7 @@ static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, u32 flags, | |||
217 | INIT_POLL_DELAY, | 217 | INIT_POLL_DELAY, |
218 | INIT_POLL_TIMEOUT); | 218 | INIT_POLL_TIMEOUT); |
219 | if (err) { | 219 | if (err) { |
220 | dev_err(priv->dev, "Timeout waiting for PCFG_INIT"); | 220 | dev_err(&mgr->dev, "Timeout waiting for PCFG_INIT\n"); |
221 | goto out_err; | 221 | goto out_err; |
222 | } | 222 | } |
223 | 223 | ||
@@ -231,7 +231,7 @@ static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, u32 flags, | |||
231 | INIT_POLL_DELAY, | 231 | INIT_POLL_DELAY, |
232 | INIT_POLL_TIMEOUT); | 232 | INIT_POLL_TIMEOUT); |
233 | if (err) { | 233 | if (err) { |
234 | dev_err(priv->dev, "Timeout waiting for !PCFG_INIT"); | 234 | dev_err(&mgr->dev, "Timeout waiting for !PCFG_INIT\n"); |
235 | goto out_err; | 235 | goto out_err; |
236 | } | 236 | } |
237 | 237 | ||
@@ -245,7 +245,7 @@ static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, u32 flags, | |||
245 | INIT_POLL_DELAY, | 245 | INIT_POLL_DELAY, |
246 | INIT_POLL_TIMEOUT); | 246 | INIT_POLL_TIMEOUT); |
247 | if (err) { | 247 | if (err) { |
248 | dev_err(priv->dev, "Timeout waiting for PCFG_INIT"); | 248 | dev_err(&mgr->dev, "Timeout waiting for PCFG_INIT\n"); |
249 | goto out_err; | 249 | goto out_err; |
250 | } | 250 | } |
251 | } | 251 | } |
@@ -262,7 +262,7 @@ static int zynq_fpga_ops_write_init(struct fpga_manager *mgr, u32 flags, | |||
262 | /* check that we have room in the command queue */ | 262 | /* check that we have room in the command queue */ |
263 | status = zynq_fpga_read(priv, STATUS_OFFSET); | 263 | status = zynq_fpga_read(priv, STATUS_OFFSET); |
264 | if (status & STATUS_DMA_Q_F) { | 264 | if (status & STATUS_DMA_Q_F) { |
265 | dev_err(priv->dev, "DMA command queue full"); | 265 | dev_err(&mgr->dev, "DMA command queue full\n"); |
266 | err = -EBUSY; | 266 | err = -EBUSY; |
267 | goto out_err; | 267 | goto out_err; |
268 | } | 268 | } |
@@ -295,7 +295,8 @@ static int zynq_fpga_ops_write(struct fpga_manager *mgr, | |||
295 | in_count = count; | 295 | in_count = count; |
296 | priv = mgr->priv; | 296 | priv = mgr->priv; |
297 | 297 | ||
298 | kbuf = dma_alloc_coherent(priv->dev, count, &dma_addr, GFP_KERNEL); | 298 | kbuf = |
299 | dma_alloc_coherent(mgr->dev.parent, count, &dma_addr, GFP_KERNEL); | ||
299 | if (!kbuf) | 300 | if (!kbuf) |
300 | return -ENOMEM; | 301 | return -ENOMEM; |
301 | 302 | ||
@@ -331,19 +332,19 @@ static int zynq_fpga_ops_write(struct fpga_manager *mgr, | |||
331 | zynq_fpga_write(priv, INT_STS_OFFSET, intr_status); | 332 | zynq_fpga_write(priv, INT_STS_OFFSET, intr_status); |
332 | 333 | ||
333 | if (!((intr_status & IXR_D_P_DONE_MASK) == IXR_D_P_DONE_MASK)) { | 334 | if (!((intr_status & IXR_D_P_DONE_MASK) == IXR_D_P_DONE_MASK)) { |
334 | dev_err(priv->dev, "Error configuring FPGA"); | 335 | dev_err(&mgr->dev, "Error configuring FPGA\n"); |
335 | err = -EFAULT; | 336 | err = -EFAULT; |
336 | } | 337 | } |
337 | 338 | ||
338 | clk_disable(priv->clk); | 339 | clk_disable(priv->clk); |
339 | 340 | ||
340 | out_free: | 341 | out_free: |
341 | dma_free_coherent(priv->dev, in_count, kbuf, dma_addr); | 342 | dma_free_coherent(mgr->dev.parent, count, kbuf, dma_addr); |
342 | |||
343 | return err; | 343 | return err; |
344 | } | 344 | } |
345 | 345 | ||
346 | static int zynq_fpga_ops_write_complete(struct fpga_manager *mgr, u32 flags) | 346 | static int zynq_fpga_ops_write_complete(struct fpga_manager *mgr, |
347 | struct fpga_image_info *info) | ||
347 | { | 348 | { |
348 | struct zynq_fpga_priv *priv = mgr->priv; | 349 | struct zynq_fpga_priv *priv = mgr->priv; |
349 | int err; | 350 | int err; |
@@ -364,7 +365,7 @@ static int zynq_fpga_ops_write_complete(struct fpga_manager *mgr, u32 flags) | |||
364 | return err; | 365 | return err; |
365 | 366 | ||
366 | /* for the partial reconfig case we didn't touch the level shifters */ | 367 | /* for the partial reconfig case we didn't touch the level shifters */ |
367 | if (!(flags & FPGA_MGR_PARTIAL_RECONFIG)) { | 368 | if (!(info->flags & FPGA_MGR_PARTIAL_RECONFIG)) { |
368 | /* enable level shifters from PL to PS */ | 369 | /* enable level shifters from PL to PS */ |
369 | regmap_write(priv->slcr, SLCR_LVL_SHFTR_EN_OFFSET, | 370 | regmap_write(priv->slcr, SLCR_LVL_SHFTR_EN_OFFSET, |
370 | LVL_SHFTR_ENABLE_PL_TO_PS); | 371 | LVL_SHFTR_ENABLE_PL_TO_PS); |
@@ -416,8 +417,6 @@ static int zynq_fpga_probe(struct platform_device *pdev) | |||
416 | if (!priv) | 417 | if (!priv) |
417 | return -ENOMEM; | 418 | return -ENOMEM; |
418 | 419 | ||
419 | priv->dev = dev; | ||
420 | |||
421 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); | 420 | res = platform_get_resource(pdev, IORESOURCE_MEM, 0); |
422 | priv->io_base = devm_ioremap_resource(dev, res); | 421 | priv->io_base = devm_ioremap_resource(dev, res); |
423 | if (IS_ERR(priv->io_base)) | 422 | if (IS_ERR(priv->io_base)) |
@@ -426,7 +425,7 @@ static int zynq_fpga_probe(struct platform_device *pdev) | |||
426 | priv->slcr = syscon_regmap_lookup_by_phandle(dev->of_node, | 425 | priv->slcr = syscon_regmap_lookup_by_phandle(dev->of_node, |
427 | "syscon"); | 426 | "syscon"); |
428 | if (IS_ERR(priv->slcr)) { | 427 | if (IS_ERR(priv->slcr)) { |
429 | dev_err(dev, "unable to get zynq-slcr regmap"); | 428 | dev_err(dev, "unable to get zynq-slcr regmap\n"); |
430 | return PTR_ERR(priv->slcr); | 429 | return PTR_ERR(priv->slcr); |
431 | } | 430 | } |
432 | 431 | ||
@@ -434,38 +433,41 @@ static int zynq_fpga_probe(struct platform_device *pdev) | |||
434 | 433 | ||
435 | priv->irq = platform_get_irq(pdev, 0); | 434 | priv->irq = platform_get_irq(pdev, 0); |
436 | if (priv->irq < 0) { | 435 | if (priv->irq < 0) { |
437 | dev_err(dev, "No IRQ available"); | 436 | dev_err(dev, "No IRQ available\n"); |
438 | return priv->irq; | 437 | return priv->irq; |
439 | } | 438 | } |
440 | 439 | ||
441 | err = devm_request_irq(dev, priv->irq, zynq_fpga_isr, 0, | ||
442 | dev_name(dev), priv); | ||
443 | if (err) { | ||
444 | dev_err(dev, "unable to request IRQ"); | ||
445 | return err; | ||
446 | } | ||
447 | |||
448 | priv->clk = devm_clk_get(dev, "ref_clk"); | 440 | priv->clk = devm_clk_get(dev, "ref_clk"); |
449 | if (IS_ERR(priv->clk)) { | 441 | if (IS_ERR(priv->clk)) { |
450 | dev_err(dev, "input clock not found"); | 442 | dev_err(dev, "input clock not found\n"); |
451 | return PTR_ERR(priv->clk); | 443 | return PTR_ERR(priv->clk); |
452 | } | 444 | } |
453 | 445 | ||
454 | err = clk_prepare_enable(priv->clk); | 446 | err = clk_prepare_enable(priv->clk); |
455 | if (err) { | 447 | if (err) { |
456 | dev_err(dev, "unable to enable clock"); | 448 | dev_err(dev, "unable to enable clock\n"); |
457 | return err; | 449 | return err; |
458 | } | 450 | } |
459 | 451 | ||
460 | /* unlock the device */ | 452 | /* unlock the device */ |
461 | zynq_fpga_write(priv, UNLOCK_OFFSET, UNLOCK_MASK); | 453 | zynq_fpga_write(priv, UNLOCK_OFFSET, UNLOCK_MASK); |
462 | 454 | ||
455 | zynq_fpga_write(priv, INT_MASK_OFFSET, 0xFFFFFFFF); | ||
456 | zynq_fpga_write(priv, INT_STS_OFFSET, IXR_ALL_MASK); | ||
457 | err = devm_request_irq(dev, priv->irq, zynq_fpga_isr, 0, dev_name(dev), | ||
458 | priv); | ||
459 | if (err) { | ||
460 | dev_err(dev, "unable to request IRQ\n"); | ||
461 | clk_disable_unprepare(priv->clk); | ||
462 | return err; | ||
463 | } | ||
464 | |||
463 | clk_disable(priv->clk); | 465 | clk_disable(priv->clk); |
464 | 466 | ||
465 | err = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", | 467 | err = fpga_mgr_register(dev, "Xilinx Zynq FPGA Manager", |
466 | &zynq_fpga_ops, priv); | 468 | &zynq_fpga_ops, priv); |
467 | if (err) { | 469 | if (err) { |
468 | dev_err(dev, "unable to register FPGA manager"); | 470 | dev_err(dev, "unable to register FPGA manager\n"); |
469 | clk_unprepare(priv->clk); | 471 | clk_unprepare(priv->clk); |
470 | return err; | 472 | return err; |
471 | } | 473 | } |