]> git.proxmox.com Git - mirror_ubuntu-kernels.git/commitdiff
coresight: Rearrange platform data probing
authorSuzuki K Poulose <suzuki.poulose@arm.com>
Wed, 19 Jun 2019 19:53:00 +0000 (13:53 -0600)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 20 Jun 2019 05:56:13 +0000 (07:56 +0200)
We are about to introduce methods to clean up the platform data
as we switch to tracking the device reference from "name" to "fwnode
handles" for device connections. This requires us to drop the fwnode
handle references when the data is no longer required - i.e, when
the device probe fails or the device gets unregistered.

In order to consolidate the invocation of the cleanup, we delay the
platform probing to the very last minute, possibly before invoking
the coresight_register. Then, we leave the coresight core code to
do the clean up. i.e, if the coresight_register fails, it takes
care of freeing the data. Otherwise, coresight_unregister will
do the necessary operations.

Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
Signed-off-by: Mathieu Poirier <mathieu.poirier@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/hwtracing/coresight/coresight-catu.c
drivers/hwtracing/coresight/coresight-etb10.c
drivers/hwtracing/coresight/coresight-etm3x.c
drivers/hwtracing/coresight/coresight-etm4x.c
drivers/hwtracing/coresight/coresight-funnel.c
drivers/hwtracing/coresight/coresight-replicator.c
drivers/hwtracing/coresight/coresight-stm.c
drivers/hwtracing/coresight/coresight-tmc.c
drivers/hwtracing/coresight/coresight-tpiu.c

index 05c73045532ae8f938b727061f22089b04475f1c..1c1ad1268b9d05fcf71fc21e1f857d2cd69481d2 100644 (file)
@@ -505,13 +505,6 @@ static int catu_probe(struct amba_device *adev, const struct amba_id *id)
        struct device *dev = &adev->dev;
        void __iomem *base;
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata)) {
-               ret = PTR_ERR(pdata);
-               goto out;
-       }
-       dev->platform_data = pdata;
-
        drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
        if (!drvdata) {
                ret = -ENOMEM;
@@ -544,6 +537,13 @@ static int catu_probe(struct amba_device *adev, const struct amba_id *id)
        if (ret)
                goto out;
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto out;
+       }
+       dev->platform_data = pdata;
+
        drvdata->base = base;
        catu_desc.pdata = pdata;
        catu_desc.dev = dev;
index 8726d6c7663cd6a5c7b864e17616ca86017f23c2..fffaac3e3677cdc9bec547b14d57da741f66c306 100644 (file)
@@ -733,11 +733,6 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
        struct resource *res = &adev->res;
        struct coresight_desc desc = { 0 };
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-       adev->dev.platform_data = pdata;
-
        drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
        if (!drvdata)
                return -ENOMEM;
@@ -772,6 +767,11 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
        /* This device is not associated with a session */
        drvdata->pid = -1;
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata))
+               return PTR_ERR(pdata);
+       adev->dev.platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_SINK;
        desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
        desc.ops = &etb_cs_ops;
index 101fb01e20de24063ed92674d207777730968361..f2d461610a2f726475e09168939b997f3e4da079 100644 (file)
@@ -795,11 +795,6 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
        if (!drvdata)
                return -ENOMEM;
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-
-       adev->dev.platform_data = pdata;
        drvdata->use_cp14 = fwnode_property_read_bool(dev->fwnode, "arm,cp14");
        dev_set_drvdata(dev, drvdata);
 
@@ -849,6 +844,13 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
        etm_init_trace_id(drvdata);
        etm_set_default(&drvdata->config);
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto err_arch_supported;
+       }
+       adev->dev.platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_SOURCE;
        desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
        desc.ops = &etm_cs_ops;
index 8adc1485cd89e253535dfa158e082bf917f0ee61..1609da1eaf832c09edbefac5940a69945247f7bc 100644 (file)
@@ -1089,11 +1089,6 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
        if (!drvdata)
                return -ENOMEM;
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-       adev->dev.platform_data = pdata;
-
        dev_set_drvdata(dev, drvdata);
 
        /* Validity for the resource is already checked by the AMBA core */
@@ -1136,6 +1131,13 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
        etm4_init_trace_id(drvdata);
        etm4_set_default(&drvdata->config);
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto err_arch_supported;
+       }
+       adev->dev.platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_SOURCE;
        desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
        desc.ops = &etm4_cs_ops;
index ded33f5e7d43bc1960063294db80032a6a94df6d..75fa2d3ad9b47342cb5d65f437a0a8adc9c32770 100644 (file)
@@ -188,11 +188,6 @@ static int funnel_probe(struct device *dev, struct resource *res)
        struct funnel_drvdata *drvdata;
        struct coresight_desc desc = { 0 };
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-       dev->platform_data = pdata;
-
        if (is_of_node(dev_fwnode(dev)) &&
            of_device_is_compatible(dev->of_node, "arm,coresight-funnel"))
                pr_warn_once("Uses OBSOLETE CoreSight funnel binding\n");
@@ -224,6 +219,13 @@ static int funnel_probe(struct device *dev, struct resource *res)
 
        dev_set_drvdata(dev, drvdata);
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto out_disable_clk;
+       }
+       dev->platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_LINK;
        desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG;
        desc.ops = &funnel_cs_ops;
index f28bafd9899501c84b1724793a2dde20e5f524cb..64dfde7241c19b12d6366f7d5b95a64ca798c933 100644 (file)
@@ -179,11 +179,6 @@ static int replicator_probe(struct device *dev, struct resource *res)
        struct coresight_desc desc = { 0 };
        void __iomem *base;
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-       dev->platform_data = pdata;
-
        if (is_of_node(dev_fwnode(dev)) &&
            of_device_is_compatible(dev->of_node, "arm,coresight-replicator"))
                pr_warn_once("Uses OBSOLETE CoreSight replicator binding\n");
@@ -215,6 +210,13 @@ static int replicator_probe(struct device *dev, struct resource *res)
 
        dev_set_drvdata(dev, drvdata);
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto out_disable_clk;
+       }
+       dev->platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_LINK;
        desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
        desc.ops = &replicator_cs_ops;
index 02031d93fb8b1fab0e65955c9224d046e0aa1859..03528f3fa9ff41689fbb888f7852e1061795940c 100644 (file)
@@ -810,10 +810,6 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
        size_t bitmap_size;
        struct coresight_desc desc = { 0 };
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-       adev->dev.platform_data = pdata;
        drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
        if (!drvdata)
                return -ENOMEM;
@@ -866,6 +862,13 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
                return -EPROBE_DEFER;
        }
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto stm_unregister;
+       }
+       adev->dev.platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_SOURCE;
        desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE;
        desc.ops = &stm_cs_ops;
index 44a5719882197401edc28b2344ac08ad1352a3d5..212630e65cca822999b2384c4308ec2565f2f28d 100644 (file)
@@ -398,13 +398,6 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
        struct resource *res = &adev->res;
        struct coresight_desc desc = { 0 };
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata)) {
-               ret = PTR_ERR(pdata);
-               goto out;
-       }
-       adev->dev.platform_data = pdata;
-
        ret = -ENOMEM;
        drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
        if (!drvdata)
@@ -434,7 +427,6 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
        else
                drvdata->size = readl_relaxed(drvdata->base + TMC_RSZ) * 4;
 
-       desc.pdata = pdata;
        desc.dev = dev;
        desc.groups = coresight_tmc_groups;
        desc.name = dev_name(dev);
@@ -467,6 +459,14 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
                goto out;
        }
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata)) {
+               ret = PTR_ERR(pdata);
+               goto out;
+       }
+       adev->dev.platform_data = pdata;
+       desc.pdata = pdata;
+
        drvdata->csdev = coresight_register(&desc);
        if (IS_ERR(drvdata->csdev)) {
                ret = PTR_ERR(drvdata->csdev);
index d8a2e3991c7e6e74bdeac91f27a1d967776c75f1..b699d613425d65391bca643d3a53d19ab85f9fa2 100644 (file)
@@ -125,11 +125,6 @@ static int tpiu_probe(struct amba_device *adev, const struct amba_id *id)
        struct resource *res = &adev->res;
        struct coresight_desc desc = { 0 };
 
-       pdata = coresight_get_platform_data(dev);
-       if (IS_ERR(pdata))
-               return PTR_ERR(pdata);
-       dev->platform_data = pdata;
-
        drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
        if (!drvdata)
                return -ENOMEM;
@@ -152,6 +147,11 @@ static int tpiu_probe(struct amba_device *adev, const struct amba_id *id)
        /* Disable tpiu to support older devices */
        tpiu_disable_hw(drvdata);
 
+       pdata = coresight_get_platform_data(dev);
+       if (IS_ERR(pdata))
+               return PTR_ERR(pdata);
+       dev->platform_data = pdata;
+
        desc.type = CORESIGHT_DEV_TYPE_SINK;
        desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_PORT;
        desc.ops = &tpiu_cs_ops;