coresight: Use local coresight_desc instances

Each coresight device prepares a description for coresight_register()
in struct coresight_desc. Once we register the device, the description is
useless and can be freed. The coresight_desc is small enough (48bytes on
64bit)i to be allocated on the stack. Hence use an automatic variable to
avoid a needless dynamic allocation and wasting the memory(which will only
be free'd when the device is destroyed).

Cc: Mathieu Poirier <mathieu.poirier@linaro.org>
Cc: Pratik Patel <pratikp@codeaurora.org>
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>
This commit is contained in:
Suzuki K Poulose 2016-08-25 15:19:05 -06:00 committed by Greg Kroah-Hartman
parent 7f73b0b9fa
commit 9486295ad1
9 changed files with 75 additions and 114 deletions

View File

@ -636,7 +636,7 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct etb_drvdata *drvdata; struct etb_drvdata *drvdata;
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
if (np) { if (np) {
@ -682,17 +682,13 @@ static int etb_probe(struct amba_device *adev, const struct amba_id *id)
return -ENOMEM; return -ENOMEM;
} }
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); desc.type = CORESIGHT_DEV_TYPE_SINK;
if (!desc) desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
return -ENOMEM; desc.ops = &etb_cs_ops;
desc.pdata = pdata;
desc->type = CORESIGHT_DEV_TYPE_SINK; desc.dev = dev;
desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER; desc.groups = coresight_etb_groups;
desc->ops = &etb_cs_ops; drvdata->csdev = coresight_register(&desc);
desc->pdata = pdata;
desc->dev = dev;
desc->groups = coresight_etb_groups;
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) if (IS_ERR(drvdata->csdev))
return PTR_ERR(drvdata->csdev); return PTR_ERR(drvdata->csdev);

View File

@ -756,13 +756,9 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct etm_drvdata *drvdata; struct etm_drvdata *drvdata;
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
if (!desc)
return -ENOMEM;
drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
if (!drvdata) if (!drvdata)
return -ENOMEM; return -ENOMEM;
@ -825,13 +821,13 @@ static int etm_probe(struct amba_device *adev, const struct amba_id *id)
etm_init_trace_id(drvdata); etm_init_trace_id(drvdata);
etm_set_default(&drvdata->config); etm_set_default(&drvdata->config);
desc->type = CORESIGHT_DEV_TYPE_SOURCE; desc.type = CORESIGHT_DEV_TYPE_SOURCE;
desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
desc->ops = &etm_cs_ops; desc.ops = &etm_cs_ops;
desc->pdata = pdata; desc.pdata = pdata;
desc->dev = dev; desc.dev = dev;
desc->groups = coresight_etm_groups; desc.groups = coresight_etm_groups;
drvdata->csdev = coresight_register(desc); drvdata->csdev = coresight_register(&desc);
if (IS_ERR(drvdata->csdev)) { if (IS_ERR(drvdata->csdev)) {
ret = PTR_ERR(drvdata->csdev); ret = PTR_ERR(drvdata->csdev);
goto err_arch_supported; goto err_arch_supported;

View File

@ -711,13 +711,9 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct etmv4_drvdata *drvdata; struct etmv4_drvdata *drvdata;
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
if (!desc)
return -ENOMEM;
drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL);
if (!drvdata) if (!drvdata)
return -ENOMEM; return -ENOMEM;
@ -772,13 +768,13 @@ static int etm4_probe(struct amba_device *adev, const struct amba_id *id)
etm4_init_trace_id(drvdata); etm4_init_trace_id(drvdata);
etm4_set_default(&drvdata->config); etm4_set_default(&drvdata->config);
desc->type = CORESIGHT_DEV_TYPE_SOURCE; desc.type = CORESIGHT_DEV_TYPE_SOURCE;
desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC; desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_PROC;
desc->ops = &etm4_cs_ops; desc.ops = &etm4_cs_ops;
desc->pdata = pdata; desc.pdata = pdata;
desc->dev = dev; desc.dev = dev;
desc->groups = coresight_etmv4_groups; desc.groups = coresight_etmv4_groups;
drvdata->csdev = coresight_register(desc); drvdata->csdev = coresight_register(&desc);
if (IS_ERR(drvdata->csdev)) { if (IS_ERR(drvdata->csdev)) {
ret = PTR_ERR(drvdata->csdev); ret = PTR_ERR(drvdata->csdev);
goto err_arch_supported; goto err_arch_supported;

View File

@ -176,7 +176,7 @@ static int funnel_probe(struct amba_device *adev, const struct amba_id *id)
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct funnel_drvdata *drvdata; struct funnel_drvdata *drvdata;
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
if (np) { if (np) {
@ -207,17 +207,13 @@ static int funnel_probe(struct amba_device *adev, const struct amba_id *id)
drvdata->base = base; drvdata->base = base;
pm_runtime_put(&adev->dev); pm_runtime_put(&adev->dev);
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); desc.type = CORESIGHT_DEV_TYPE_LINK;
if (!desc) desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG;
return -ENOMEM; desc.ops = &funnel_cs_ops;
desc.pdata = pdata;
desc->type = CORESIGHT_DEV_TYPE_LINK; desc.dev = dev;
desc->subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_MERG; desc.groups = coresight_funnel_groups;
desc->ops = &funnel_cs_ops; drvdata->csdev = coresight_register(&desc);
desc->pdata = pdata;
desc->dev = dev;
desc->groups = coresight_funnel_groups;
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) if (IS_ERR(drvdata->csdev))
return PTR_ERR(drvdata->csdev); return PTR_ERR(drvdata->csdev);

View File

@ -102,7 +102,7 @@ static int replicator_probe(struct amba_device *adev, const struct amba_id *id)
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct replicator_state *drvdata; struct replicator_state *drvdata;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
void __iomem *base; void __iomem *base;
@ -134,16 +134,12 @@ static int replicator_probe(struct amba_device *adev, const struct amba_id *id)
dev_set_drvdata(dev, drvdata); dev_set_drvdata(dev, drvdata);
pm_runtime_put(&adev->dev); pm_runtime_put(&adev->dev);
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); desc.type = CORESIGHT_DEV_TYPE_LINK;
if (!desc) desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
return -ENOMEM; desc.ops = &replicator_cs_ops;
desc.pdata = adev->dev.platform_data;
desc->type = CORESIGHT_DEV_TYPE_LINK; desc.dev = &adev->dev;
desc->subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT; drvdata->csdev = coresight_register(&desc);
desc->ops = &replicator_cs_ops;
desc->pdata = adev->dev.platform_data;
desc->dev = &adev->dev;
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) if (IS_ERR(drvdata->csdev))
return PTR_ERR(drvdata->csdev); return PTR_ERR(drvdata->csdev);

View File

@ -69,7 +69,7 @@ static int replicator_probe(struct platform_device *pdev)
struct device *dev = &pdev->dev; struct device *dev = &pdev->dev;
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct replicator_drvdata *drvdata; struct replicator_drvdata *drvdata;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = pdev->dev.of_node; struct device_node *np = pdev->dev.of_node;
if (np) { if (np) {
@ -95,18 +95,12 @@ static int replicator_probe(struct platform_device *pdev)
pm_runtime_enable(&pdev->dev); pm_runtime_enable(&pdev->dev);
platform_set_drvdata(pdev, drvdata); platform_set_drvdata(pdev, drvdata);
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); desc.type = CORESIGHT_DEV_TYPE_LINK;
if (!desc) { desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
ret = -ENOMEM; desc.ops = &replicator_cs_ops;
goto out_disable_pm; desc.pdata = pdev->dev.platform_data;
} desc.dev = &pdev->dev;
drvdata->csdev = coresight_register(&desc);
desc->type = CORESIGHT_DEV_TYPE_LINK;
desc->subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_SPLIT;
desc->ops = &replicator_cs_ops;
desc->pdata = pdev->dev.platform_data;
desc->dev = &pdev->dev;
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) { if (IS_ERR(drvdata->csdev)) {
ret = PTR_ERR(drvdata->csdev); ret = PTR_ERR(drvdata->csdev);
goto out_disable_pm; goto out_disable_pm;

View File

@ -799,7 +799,7 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct resource ch_res; struct resource ch_res;
size_t res_size, bitmap_size; size_t res_size, bitmap_size;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
if (np) { if (np) {
@ -865,19 +865,13 @@ static int stm_probe(struct amba_device *adev, const struct amba_id *id)
return -EPROBE_DEFER; return -EPROBE_DEFER;
} }
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); desc.type = CORESIGHT_DEV_TYPE_SOURCE;
if (!desc) { desc.subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE;
ret = -ENOMEM; desc.ops = &stm_cs_ops;
goto stm_unregister; desc.pdata = pdata;
} desc.dev = dev;
desc.groups = coresight_stm_groups;
desc->type = CORESIGHT_DEV_TYPE_SOURCE; drvdata->csdev = coresight_register(&desc);
desc->subtype.source_subtype = CORESIGHT_DEV_SUBTYPE_SOURCE_SOFTWARE;
desc->ops = &stm_cs_ops;
desc->pdata = pdata;
desc->dev = dev;
desc->groups = coresight_stm_groups;
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) { if (IS_ERR(drvdata->csdev)) {
ret = PTR_ERR(drvdata->csdev); ret = PTR_ERR(drvdata->csdev);
goto stm_unregister; goto stm_unregister;

View File

@ -302,7 +302,7 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct tmc_drvdata *drvdata; struct tmc_drvdata *drvdata;
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
if (np) { if (np) {
@ -319,10 +319,6 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
if (!drvdata) if (!drvdata)
goto out; goto out;
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL);
if (!desc)
goto out;
drvdata->dev = &adev->dev; drvdata->dev = &adev->dev;
dev_set_drvdata(dev, drvdata); dev_set_drvdata(dev, drvdata);
@ -354,24 +350,25 @@ static int tmc_probe(struct amba_device *adev, const struct amba_id *id)
pm_runtime_put(&adev->dev); pm_runtime_put(&adev->dev);
desc->pdata = pdata; desc.pdata = pdata;
desc->dev = dev; desc.dev = dev;
desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER; desc.groups = coresight_tmc_groups;
desc->groups = coresight_tmc_groups;
if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) { if (drvdata->config_type == TMC_CONFIG_TYPE_ETB) {
desc->type = CORESIGHT_DEV_TYPE_SINK; desc.type = CORESIGHT_DEV_TYPE_SINK;
desc->ops = &tmc_etb_cs_ops; desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
desc.ops = &tmc_etb_cs_ops;
} else if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) { } else if (drvdata->config_type == TMC_CONFIG_TYPE_ETR) {
desc->type = CORESIGHT_DEV_TYPE_SINK; desc.type = CORESIGHT_DEV_TYPE_SINK;
desc->ops = &tmc_etr_cs_ops; desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_BUFFER;
desc.ops = &tmc_etr_cs_ops;
} else { } else {
desc->type = CORESIGHT_DEV_TYPE_LINKSINK; desc.type = CORESIGHT_DEV_TYPE_LINKSINK;
desc->subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_FIFO; desc.subtype.link_subtype = CORESIGHT_DEV_SUBTYPE_LINK_FIFO;
desc->ops = &tmc_etf_cs_ops; desc.ops = &tmc_etf_cs_ops;
} }
drvdata->csdev = coresight_register(desc); drvdata->csdev = coresight_register(&desc);
if (IS_ERR(drvdata->csdev)) { if (IS_ERR(drvdata->csdev)) {
ret = PTR_ERR(drvdata->csdev); ret = PTR_ERR(drvdata->csdev);
goto out; goto out;

View File

@ -119,7 +119,7 @@ static int tpiu_probe(struct amba_device *adev, const struct amba_id *id)
struct coresight_platform_data *pdata = NULL; struct coresight_platform_data *pdata = NULL;
struct tpiu_drvdata *drvdata; struct tpiu_drvdata *drvdata;
struct resource *res = &adev->res; struct resource *res = &adev->res;
struct coresight_desc *desc; struct coresight_desc desc = { 0 };
struct device_node *np = adev->dev.of_node; struct device_node *np = adev->dev.of_node;
if (np) { if (np) {
@ -154,16 +154,12 @@ static int tpiu_probe(struct amba_device *adev, const struct amba_id *id)
pm_runtime_put(&adev->dev); pm_runtime_put(&adev->dev);
desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); desc.type = CORESIGHT_DEV_TYPE_SINK;
if (!desc) desc.subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_PORT;
return -ENOMEM; desc.ops = &tpiu_cs_ops;
desc.pdata = pdata;
desc->type = CORESIGHT_DEV_TYPE_SINK; desc.dev = dev;
desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_PORT; drvdata->csdev = coresight_register(&desc);
desc->ops = &tpiu_cs_ops;
desc->pdata = pdata;
desc->dev = dev;
drvdata->csdev = coresight_register(desc);
if (IS_ERR(drvdata->csdev)) if (IS_ERR(drvdata->csdev))
return PTR_ERR(drvdata->csdev); return PTR_ERR(drvdata->csdev);