Update the zl3073x driver to utilize the DPLL reference count tracking
infrastructure.

Add dpll_tracker fields to the driver's internal device and pin
structures. Pass pointers to these trackers when calling
dpll_device_get/put() and dpll_pin_get/put().

This allows a developer to inspect the specific references held by this
driver via debugfs when CONFIG_DPLL_REFCNT_TRACKER is enabled, aiding
in the debugging of resource leaks.

Signed-off-by: Ivan Vecera <[email protected]>
---
 drivers/dpll/zl3073x/dpll.c | 14 ++++++++------
 drivers/dpll/zl3073x/dpll.h |  1 +
 2 files changed, 9 insertions(+), 6 deletions(-)

diff --git a/drivers/dpll/zl3073x/dpll.c b/drivers/dpll/zl3073x/dpll.c
index 4135c621ec1aa..a14ac90ecbd66 100644
--- a/drivers/dpll/zl3073x/dpll.c
+++ b/drivers/dpll/zl3073x/dpll.c
@@ -45,6 +45,7 @@ struct zl3073x_dpll_pin {
        struct list_head        list;
        struct zl3073x_dpll     *dpll;
        struct dpll_pin         *dpll_pin;
+       dpll_tracker            tracker;
        char                    label[8];
        enum dpll_pin_direction dir;
        u8                      id;
@@ -1369,7 +1370,8 @@ zl3073x_dpll_pin_register(struct zl3073x_dpll_pin *pin, 
u32 index)
 
        /* Create or get existing DPLL pin */
        pin->dpll_pin = dpll_pin_get(zldpll->dev->clock_id, index, THIS_MODULE,
-                                    &props->dpll_props, props->fwnode, NULL);
+                                    &props->dpll_props, props->fwnode,
+                                    &pin->tracker);
        if (IS_ERR(pin->dpll_pin)) {
                rc = PTR_ERR(pin->dpll_pin);
                goto err_pin_get;
@@ -1391,7 +1393,7 @@ zl3073x_dpll_pin_register(struct zl3073x_dpll_pin *pin, 
u32 index)
        return 0;
 
 err_register:
-       dpll_pin_put(pin->dpll_pin, NULL);
+       dpll_pin_put(pin->dpll_pin, &pin->tracker);
 err_prio_get:
        pin->dpll_pin = NULL;
 err_pin_get:
@@ -1422,7 +1424,7 @@ zl3073x_dpll_pin_unregister(struct zl3073x_dpll_pin *pin)
        /* Unregister the pin */
        dpll_pin_unregister(zldpll->dpll_dev, pin->dpll_pin, ops, pin);
 
-       dpll_pin_put(pin->dpll_pin, NULL);
+       dpll_pin_put(pin->dpll_pin, &pin->tracker);
        pin->dpll_pin = NULL;
 }
 
@@ -1596,7 +1598,7 @@ zl3073x_dpll_device_register(struct zl3073x_dpll *zldpll)
                                       dpll_mode_refsel);
 
        zldpll->dpll_dev = dpll_device_get(zldev->clock_id, zldpll->id,
-                                          THIS_MODULE, NULL);
+                                          THIS_MODULE, &zldpll->tracker);
        if (IS_ERR(zldpll->dpll_dev)) {
                rc = PTR_ERR(zldpll->dpll_dev);
                zldpll->dpll_dev = NULL;
@@ -1608,7 +1610,7 @@ zl3073x_dpll_device_register(struct zl3073x_dpll *zldpll)
                                  zl3073x_prop_dpll_type_get(zldev, zldpll->id),
                                  &zl3073x_dpll_device_ops, zldpll);
        if (rc) {
-               dpll_device_put(zldpll->dpll_dev, NULL);
+               dpll_device_put(zldpll->dpll_dev, &zldpll->tracker);
                zldpll->dpll_dev = NULL;
        }
 
@@ -1631,7 +1633,7 @@ zl3073x_dpll_device_unregister(struct zl3073x_dpll 
*zldpll)
 
        dpll_device_unregister(zldpll->dpll_dev, &zl3073x_dpll_device_ops,
                               zldpll);
-       dpll_device_put(zldpll->dpll_dev, NULL);
+       dpll_device_put(zldpll->dpll_dev, &zldpll->tracker);
        zldpll->dpll_dev = NULL;
 }
 
diff --git a/drivers/dpll/zl3073x/dpll.h b/drivers/dpll/zl3073x/dpll.h
index e8c39b44b356c..9b2183ca07e47 100644
--- a/drivers/dpll/zl3073x/dpll.h
+++ b/drivers/dpll/zl3073x/dpll.h
@@ -31,6 +31,7 @@ struct zl3073x_dpll {
        u8                              check_count;
        bool                            phase_monitor;
        struct dpll_device              *dpll_dev;
+       dpll_tracker                    tracker;
        enum dpll_lock_status           lock_status;
        struct list_head                pins;
        struct work_struct              change_work;
-- 
2.51.2

Reply via email to