Merge tag 'for-linus-5.3' of git://github.com/cminyard/linux-ipmi
[linux-2.6-block.git] / drivers / hwtracing / coresight / coresight-tmc.c
index 44a5719882197401edc28b2344ac08ad1352a3d5..be37aff573b44a225de50a1dd36475cafc1ecfc5 100644 (file)
 #include "coresight-priv.h"
 #include "coresight-tmc.h"
 
+DEFINE_CORESIGHT_DEVLIST(etb_devs, "tmc_etb");
+DEFINE_CORESIGHT_DEVLIST(etf_devs, "tmc_etf");
+DEFINE_CORESIGHT_DEVLIST(etr_devs, "tmc_etr");
+
 void tmc_wait_for_tmcready(struct tmc_drvdata *drvdata)
 {
        /* Ensure formatter, unformatter and hardware fifo are empty */
@@ -397,13 +401,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
        struct tmc_drvdata *drvdata;
        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;
+       struct coresight_dev_list *dev_list = NULL;
 
        ret = -ENOMEM;
        drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
@@ -434,16 +432,15 @@ 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);
 
        switch (drvdata->config_type) {
        case TMC_CONFIG_TYPE_ETB:
                desc.type = CORESIGHT_DEV_TYPE_SINK;
                desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
                desc.ops = &tmc_etb_cs_ops;
+               dev_list = &etb_devs;
                break;
        case TMC_CONFIG_TYPE_ETR:
                desc.type = CORESIGHT_DEV_TYPE_SINK;
@@ -455,11 +452,13 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
                        goto out;
                idr_init(&drvdata->idr);
                mutex_init(&drvdata->idr_mutex);
+               dev_list = &etr_devs;
                break;
        case TMC_CONFIG_TYPE_ETF:
                desc.type = CORESIGHT_DEV_TYPE_LINKSINK;
                desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_FIFO;
                desc.ops = &tmc_etf_cs_ops;
+               dev_list = &etf_devs;
                break;
        default:
                pr_err("%s: Unsupported TMC config\n", desc.name);
@@ -467,6 +466,20 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
                goto out;
        }
 
+       desc.name = coresight_alloc_device_name(dev_list, dev);
+       if (!desc.name) {
+               ret = -ENOMEM;
+               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);