Skip to content

Commit

Permalink
backports: uio: from: linux.git
Browse files Browse the repository at this point in the history
Reference: v5.10.213
Signed-off-by: Robert Nelson <robertcnelson@gmail.com>
  • Loading branch information
RobertCNelson committed Mar 22, 2024
1 parent 16fd612 commit 5c4942f
Showing 1 changed file with 34 additions and 10 deletions.
44 changes: 34 additions & 10 deletions drivers/uio/uio_pruss.c
Original file line number Diff line number Diff line change
@@ -1,11 +1,19 @@
// SPDX-License-Identifier: GPL-2.0-only
/*
* Programmable Real-Time Unit Sub System (PRUSS) UIO driver (uio_pruss)
*
* This driver exports PRUSS host event out interrupts and PRUSS, L3 RAM,
* and DDR RAM to user space for applications interacting with PRUSS firmware
*
* Copyright (C) 2010-11 Texas Instruments Incorporated - http://www.ti.com/
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation version 2.
*
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
* kind, whether express or implied; without even the implied warranty
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#include <linux/device.h>
#include <linux/module.h>
Expand Down Expand Up @@ -91,6 +99,7 @@ static void pruss_cleanup(struct device *dev, struct uio_pruss_dev *gdev)

for (cnt = 0; cnt < MAX_PRUSS_EVT; cnt++, p++) {
uio_unregister_device(p);
kfree(p->name);
}
iounmap(gdev->prussio_vaddr);
if (gdev->ddr_vaddr) {
Expand All @@ -101,7 +110,10 @@ static void pruss_cleanup(struct device *dev, struct uio_pruss_dev *gdev)
gen_pool_free(gdev->sram_pool,
gdev->sram_vaddr,
sram_pool_sz);
kfree(gdev->info);
clk_disable(gdev->pruss_clk);
clk_put(gdev->pruss_clk);
kfree(gdev);
}

static int pruss_probe(struct platform_device *pdev)
Expand All @@ -113,25 +125,28 @@ static int pruss_probe(struct platform_device *pdev)
int ret, cnt, i, len;
struct uio_pruss_pdata *pdata = dev_get_platdata(dev);

gdev = devm_kzalloc(dev, sizeof(struct uio_pruss_dev), GFP_KERNEL);
gdev = kzalloc(sizeof(struct uio_pruss_dev), GFP_KERNEL);
if (!gdev)
return -ENOMEM;

gdev->info = devm_kcalloc(dev, MAX_PRUSS_EVT, sizeof(*p), GFP_KERNEL);
if (!gdev->info)
return -ENOMEM;
gdev->info = kcalloc(MAX_PRUSS_EVT, sizeof(*p), GFP_KERNEL);
if (!gdev->info) {
ret = -ENOMEM;
goto err_free_gdev;
}

/* Power on PRU in case its not done as part of boot-loader */
gdev->pruss_clk = devm_clk_get(dev, "pruss");
gdev->pruss_clk = clk_get(dev, "pruss");
if (IS_ERR(gdev->pruss_clk)) {
dev_err(dev, "Failed to get clock\n");
return PTR_ERR(gdev->pruss_clk);
ret = PTR_ERR(gdev->pruss_clk);
goto err_free_info;
}

ret = clk_enable(gdev->pruss_clk);
if (ret) {
dev_err(dev, "Failed to enable clock\n");
return ret;
goto err_clk_put;
}

regs_prussio = platform_get_resource(pdev, IORESOURCE_MEM, 0);
Expand Down Expand Up @@ -191,7 +206,7 @@ static int pruss_probe(struct platform_device *pdev)
p->mem[2].size = extram_pool_sz;
p->mem[2].memtype = UIO_MEM_PHYS;

p->name = devm_kasprintf(dev, GFP_KERNEL, "pruss_evt%d", cnt);
p->name = kasprintf(GFP_KERNEL, "pruss_evt%d", cnt);
p->version = DRV_VERSION;

/* Register PRUSS IRQ lines */
Expand All @@ -200,8 +215,10 @@ static int pruss_probe(struct platform_device *pdev)
p->priv = gdev;

ret = uio_register_device(dev, p);
if (ret < 0)
if (ret < 0) {
kfree(p->name);
goto err_unloop;
}
}

platform_set_drvdata(pdev, gdev);
Expand All @@ -210,6 +227,7 @@ static int pruss_probe(struct platform_device *pdev)
err_unloop:
for (i = 0, p = gdev->info; i < cnt; i++, p++) {
uio_unregister_device(p);
kfree(p->name);
}
iounmap(gdev->prussio_vaddr);
err_free_ddr_vaddr:
Expand All @@ -220,6 +238,12 @@ static int pruss_probe(struct platform_device *pdev)
gen_pool_free(gdev->sram_pool, gdev->sram_vaddr, sram_pool_sz);
err_clk_disable:
clk_disable(gdev->pruss_clk);
err_clk_put:
clk_put(gdev->pruss_clk);
err_free_info:
kfree(gdev->info);
err_free_gdev:
kfree(gdev);

return ret;
}
Expand Down

0 comments on commit 5c4942f

Please sign in to comment.