static void tpiu_abort(struct coresight_device *csdev) { struct tpiu_drvdata *drvdata = dev_get_drvdata(csdev->dev.parent); __tpiu_disable(drvdata); dev_info(drvdata->dev, "TPIU aborted\n"); }
static void __tpiu_disable_to_sdc_swdtrc(struct tpiu_drvdata *drvdata) { __tpiu_disable(drvdata); __tpiu_disable_to_sdc(drvdata); clk_disable_unprepare(drvdata->clk); }
static void __tpiu_disable_to_mictor(struct tpiu_drvdata *drvdata) { __tpiu_disable(drvdata); if (drvdata->set == TPIU_SET_A) __tpiu_disable_seta(drvdata); else if (drvdata->set == TPIU_SET_B) __tpiu_disable_setb(drvdata); }
static void __tpiu_disable_to_sdc_trace(struct tpiu_drvdata *drvdata) { /* sdc mode needs to be disabled only when tracing is enabled */ if (!drvdata->enable) return; __tpiu_disable(drvdata); __tpiu_disable_to_sdc(drvdata); }
static void __tpiu_disable_to_mictor(struct tpiu_drvdata *drvdata) { /* mictor mode needs to be disbled only when tracing is enabled */ if (!drvdata->enable) return; __tpiu_disable(drvdata); if (drvdata->set == TPIU_SET_A) __tpiu_disable_seta(drvdata); else if (drvdata->set == TPIU_SET_B) __tpiu_disable_setb(drvdata); }
static void __tpiu_disable_to_sdc(struct tpiu_drvdata *drvdata) { __tpiu_disable(drvdata); msm_tlmm_misc_reg_write(TLMM_ETM_MODE_REG, 0); clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE); regulator_disable(drvdata->reg); tpiu_reg_set_voltage(drvdata->reg, 0, drvdata->reg_high); tpiu_reg_set_optimum_mode(drvdata->reg, 0); regulator_disable(drvdata->reg_io); tpiu_reg_set_voltage(drvdata->reg_io, 0, drvdata->reg_high_io); tpiu_reg_set_optimum_mode(drvdata->reg_io, 0); }
static int tpiu_probe(struct platform_device *pdev) { int ret; struct device *dev = &pdev->dev; struct coresight_platform_data *pdata; struct tpiu_drvdata *drvdata; struct resource *res; struct coresight_desc *desc; if (coresight_fuse_access_disabled()) return -EPERM; if (pdev->dev.of_node) { pdata = of_get_coresight_platform_data(dev, pdev->dev.of_node); if (IS_ERR(pdata)) return PTR_ERR(pdata); pdev->dev.platform_data = pdata; } drvdata = devm_kzalloc(dev, sizeof(*drvdata), GFP_KERNEL); if (!drvdata) return -ENOMEM; drvdata->dev = &pdev->dev; platform_set_drvdata(pdev, drvdata); res = platform_get_resource_byname(pdev, IORESOURCE_MEM, "tpiu-base"); if (!res) return -ENODEV; drvdata->base = devm_ioremap(dev, res->start, resource_size(res)); if (!drvdata->base) return -ENOMEM; mutex_init(&drvdata->mutex); drvdata->clk = devm_clk_get(dev, "core_clk"); if (IS_ERR(drvdata->clk)) return PTR_ERR(drvdata->clk); ret = clk_set_rate(drvdata->clk, CORESIGHT_CLK_RATE_TRACE); if (ret) return ret; ret = clk_prepare_enable(drvdata->clk); if (ret) return ret; /* Disable tpiu to support older targets that need this */ __tpiu_disable(drvdata); clk_disable_unprepare(drvdata->clk); if (pdev->dev.of_node) { ret = tpiu_parse_of_data(pdev, drvdata); if (ret) return ret; } desc = devm_kzalloc(dev, sizeof(*desc), GFP_KERNEL); if (!desc) return -ENOMEM; desc->type = CORESIGHT_DEV_TYPE_SINK; desc->subtype.sink_subtype = CORESIGHT_DEV_SUBTYPE_SINK_PORT; desc->ops = &tpiu_cs_ops; desc->pdata = pdev->dev.platform_data; desc->dev = &pdev->dev; desc->groups = tpiu_attr_grps; desc->owner = THIS_MODULE; drvdata->csdev = coresight_register(desc); if (IS_ERR(drvdata->csdev)) return PTR_ERR(drvdata->csdev); dev_info(dev, "TPIU initialized\n"); return 0; }
void tpiu_disable(void) { __tpiu_disable(); tpiu.enabled = false; dev_info(tpiu.dev, "TPIU disabled\n"); }