Пример #1
0
static void sysmmu_tlb_invalidate_flpdcache(struct device *dev,
        sysmmu_iova_t iova)
{
    unsigned long flags;
    struct exynos_iommu_owner *owner = dev->archdata.iommu;
    struct sysmmu_drvdata *data = dev_get_drvdata(owner->sysmmu);

    if (!IS_ERR(data->clk_master))
        clk_enable(data->clk_master);

    spin_lock_irqsave(&data->lock, flags);
    if (is_sysmmu_active(data))
        __sysmmu_tlb_invalidate_flpdcache(data, iova);
    spin_unlock_irqrestore(&data->lock, flags);

    if (!IS_ERR(data->clk_master))
        clk_disable(data->clk_master);
}
void sysmmu_tlb_invalidate_flpdcache(struct device *dev, dma_addr_t iova)
{
	struct sysmmu_list_data *list;

	for_each_sysmmu_list(dev, list) {
		unsigned long flags;
		struct sysmmu_drvdata *drvdata = dev_get_drvdata(list->sysmmu);

		spin_lock_irqsave(&drvdata->lock, flags);
		if (is_sysmmu_active(drvdata) && drvdata->runtime_active) {
			TRACE_LOG_DEV(drvdata->sysmmu,
				"FLPD invalidation @ %#x\n", iova);
			__master_clk_enable(drvdata);
			__sysmmu_tlb_invalidate_flpdcache(
					drvdata->sfrbase, iova);
			__master_clk_disable(drvdata);
		} else {
			TRACE_LOG_DEV(drvdata->sysmmu,
				"Skip FLPD invalidation @ %#x\n", iova);
		}
		spin_unlock_irqrestore(&drvdata->lock, flags);
	}