Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 6c69abb2 authored by Seungwhan Youn's avatar Seungwhan Youn Committed by Kukjin Kim
Browse files

ARM: SAMSUNG: Move DMA clock enable into S3C PL330 driver



This patch moves DMA clock enable functionality into pl330_probe() of
plat-samsung/s3c_pl330.c (PL330 DMAC driver) and disable functionality
into pl330_remove().
For now according to clock policy of Samsung SoCs' mainline, clocks which
are used in the driver should be controlled by each own.

Signed-off-by: default avatarSeungwhan Youn <sw.youn@samsung.com>
Acked-by: default avatarJassi Brar <jassi.brar@samsung.com>
[kgene.kim@samsung.com: minor title and comment edit]
Signed-off-by: default avatarKukjin Kim <kgene.kim@samsung.com>
parent 9d59c17a
Loading
Loading
Loading
Loading
+27 −7
Original line number Diff line number Diff line
@@ -15,6 +15,8 @@
#include <linux/io.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
#include <linux/clk.h>
#include <linux/err.h>

#include <asm/hardware/pl330.h>

@@ -27,6 +29,7 @@
 * @node: To attach to the global list of DMACs.
 * @pi: PL330 configuration info for the DMAC.
 * @kmcache: Pool to quickly allocate xfers for all channels in the dmac.
 * @clk: Pointer of DMAC operation clock.
 */
struct s3c_pl330_dmac {
	unsigned		busy_chan;
@@ -34,6 +37,7 @@ struct s3c_pl330_dmac {
	struct list_head	node;
	struct pl330_info	*pi;
	struct kmem_cache	*kmcache;
	struct clk		*clk;
};

/**
@@ -1072,16 +1076,25 @@ static int pl330_probe(struct platform_device *pdev)
	if (ret)
		goto probe_err4;

	ret = pl330_add(pl330_info);
	if (ret)
		goto probe_err5;

	/* Allocate a new DMAC */
	s3c_pl330_dmac = kmalloc(sizeof(*s3c_pl330_dmac), GFP_KERNEL);
	if (!s3c_pl330_dmac) {
		ret = -ENOMEM;
		goto probe_err5;
	}

	/* Get operation clock and enable it */
	s3c_pl330_dmac->clk = clk_get(&pdev->dev, "pdma");
	if (IS_ERR(s3c_pl330_dmac->clk)) {
		dev_err(&pdev->dev, "Cannot get operation clock.\n");
		ret = -EINVAL;
		goto probe_err6;
	}
	clk_enable(s3c_pl330_dmac->clk);

	ret = pl330_add(pl330_info);
	if (ret)
		goto probe_err7;

	/* Hook the info */
	s3c_pl330_dmac->pi = pl330_info;
@@ -1094,7 +1107,7 @@ static int pl330_probe(struct platform_device *pdev)

	if (!s3c_pl330_dmac->kmcache) {
		ret = -ENOMEM;
		goto probe_err7;
		goto probe_err8;
	}

	/* Get the list of peripherals */
@@ -1120,10 +1133,13 @@ static int pl330_probe(struct platform_device *pdev)

	return 0;

probe_err8:
	pl330_del(pl330_info);
probe_err7:
	kfree(s3c_pl330_dmac);
	clk_disable(s3c_pl330_dmac->clk);
	clk_put(s3c_pl330_dmac->clk);
probe_err6:
	pl330_del(pl330_info);
	kfree(s3c_pl330_dmac);
probe_err5:
	free_irq(irq, pl330_info);
probe_err4:
@@ -1188,6 +1204,10 @@ static int pl330_remove(struct platform_device *pdev)
		}
	}

	/* Disable operation clock */
	clk_disable(dmac->clk);
	clk_put(dmac->clk);

	/* Remove the DMAC */
	list_del(&dmac->node);
	kfree(dmac);