Skip to content

Commit

Permalink
Merge branch 'imx/clk' into next/clk
Browse files Browse the repository at this point in the history
* imx/clk:
  ARM: mxs: select HAVE_CLK_PREPARE for clock
  clk: add config option HAVE_CLK_PREPARE into Kconfig
  ASoC: mxs-saif: convert to clk_prepare/clk_unprepare
  video: mxsfb: convert to clk_prepare/clk_unprepare
  serial: mxs-auart: convert to clk_prepare/clk_unprepare
  net: flexcan: convert to clk_prepare/clk_unprepare
  mtd: gpmi-lib: convert to clk_prepare/clk_unprepare
  mmc: mxs-mmc: convert to clk_prepare/clk_unprepare
  dma: mxs-dma: convert to clk_prepare/clk_unprepare
  net: fec: add clk_prepare/clk_unprepare
  ARM: mxs: convert platform code to clk_prepare/clk_unprepare
  clk: add helper functions clk_prepare_enable and clk_disable_unprepare
  • Loading branch information
Arnd Bergmann committed Jan 3, 2012
2 parents 5f0a6e2 + e1482a1 commit 8c3b229
Show file tree
Hide file tree
Showing 17 changed files with 97 additions and 58 deletions.
1 change: 1 addition & 0 deletions arch/arm/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -442,6 +442,7 @@ config ARCH_MXS
select ARCH_REQUIRE_GPIOLIB
select CLKDEV_LOOKUP
select CLKSRC_MMIO
select HAVE_CLK_PREPARE
help
Support for Freescale MXS-based family of processors

Expand Down
10 changes: 5 additions & 5 deletions arch/arm/mach-mxs/clock-mx23.c
Original file line number Diff line number Diff line change
Expand Up @@ -545,11 +545,11 @@ int __init mx23_clocks_init(void)
*/
clk_set_parent(&ssp_clk, &ref_io_clk);

clk_enable(&cpu_clk);
clk_enable(&hbus_clk);
clk_enable(&xbus_clk);
clk_enable(&emi_clk);
clk_enable(&uart_clk);
clk_prepare_enable(&cpu_clk);
clk_prepare_enable(&hbus_clk);
clk_prepare_enable(&xbus_clk);
clk_prepare_enable(&emi_clk);
clk_prepare_enable(&uart_clk);

clkdev_add_table(lookups, ARRAY_SIZE(lookups));

Expand Down
10 changes: 5 additions & 5 deletions arch/arm/mach-mxs/clock-mx28.c
Original file line number Diff line number Diff line change
Expand Up @@ -775,11 +775,11 @@ int __init mx28_clocks_init(void)
clk_set_parent(&ssp0_clk, &ref_io0_clk);
clk_set_parent(&ssp1_clk, &ref_io0_clk);

clk_enable(&cpu_clk);
clk_enable(&hbus_clk);
clk_enable(&xbus_clk);
clk_enable(&emi_clk);
clk_enable(&uart_clk);
clk_prepare_enable(&cpu_clk);
clk_prepare_enable(&hbus_clk);
clk_prepare_enable(&xbus_clk);
clk_prepare_enable(&emi_clk);
clk_prepare_enable(&uart_clk);

clk_set_parent(&lcdif_clk, &ref_pix_clk);
clk_set_parent(&saif0_clk, &pll0_clk);
Expand Down
33 changes: 23 additions & 10 deletions arch/arm/mach-mxs/clock.c
Original file line number Diff line number Diff line change
Expand Up @@ -74,10 +74,15 @@ static int __clk_enable(struct clk *clk)
return 0;
}

/* This function increments the reference count on the clock and enables the
* clock if not already enabled. The parent clock tree is recursively enabled
/*
* The clk_enable/clk_disable could be called by drivers in atomic context,
* so they should not really hold mutex. Instead, clk_prepare/clk_unprepare
* can hold a mutex, as the pair will only be called in non-atomic context.
* Before migrating to common clk framework, we can have __clk_enable and
* __clk_disable called in clk_prepare/clk_unprepare with mutex held and
* leave clk_enable/clk_disable as the dummy functions.
*/
int clk_enable(struct clk *clk)
int clk_prepare(struct clk *clk)
{
int ret = 0;

Expand All @@ -90,13 +95,9 @@ int clk_enable(struct clk *clk)

return ret;
}
EXPORT_SYMBOL(clk_enable);
EXPORT_SYMBOL(clk_prepare);

/* This function decrements the reference count on the clock and disables
* the clock when reference count is 0. The parent clock tree is
* recursively disabled
*/
void clk_disable(struct clk *clk)
void clk_unprepare(struct clk *clk)
{
if (clk == NULL || IS_ERR(clk))
return;
Expand All @@ -105,6 +106,18 @@ void clk_disable(struct clk *clk)
__clk_disable(clk);
mutex_unlock(&clocks_mutex);
}
EXPORT_SYMBOL(clk_unprepare);

int clk_enable(struct clk *clk)
{
return 0;
}
EXPORT_SYMBOL(clk_enable);

void clk_disable(struct clk *clk)
{
/* nothing to do */
}
EXPORT_SYMBOL(clk_disable);

/* Retrieve the *current* clock rate. If the clock itself
Expand Down Expand Up @@ -166,7 +179,7 @@ int clk_set_parent(struct clk *clk, struct clk *parent)
return ret;

if (clk->usecount)
clk_enable(parent);
clk_prepare_enable(parent);

mutex_lock(&clocks_mutex);
ret = clk->set_parent(clk, parent);
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-mxs/mach-mx28evk.c
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,7 @@ static void __init mx28evk_fec_reset(void)
/* Enable fec phy clock */
clk = clk_get_sys("pll2", NULL);
if (!IS_ERR(clk))
clk_enable(clk);
clk_prepare_enable(clk);

/* Power up fec phy */
ret = gpio_request(MX28EVK_FEC_PHY_POWER, "fec-phy-power");
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-mxs/system.c
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ static int __init mxs_arch_reset_init(void)

clk = clk_get_sys("rtc", NULL);
if (!IS_ERR(clk))
clk_enable(clk);
clk_prepare_enable(clk);

return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion arch/arm/mach-mxs/timer.c
Original file line number Diff line number Diff line change
Expand Up @@ -245,7 +245,7 @@ static int __init mxs_clocksource_init(struct clk *timer_clk)

void __init mxs_timer_init(struct clk *timer_clk, int irq)
{
clk_enable(timer_clk);
clk_prepare_enable(timer_clk);

/*
* Initialize timers to a known state
Expand Down
3 changes: 3 additions & 0 deletions drivers/clk/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -3,5 +3,8 @@ config CLKDEV_LOOKUP
bool
select HAVE_CLK

config HAVE_CLK_PREPARE
bool

config HAVE_MACH_CLKDEV
bool
8 changes: 4 additions & 4 deletions drivers/dma/mxs-dma.c
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ static int mxs_dma_alloc_chan_resources(struct dma_chan *chan)
goto err_irq;
}

ret = clk_enable(mxs_dma->clk);
ret = clk_prepare_enable(mxs_dma->clk);
if (ret)
goto err_clk;

Expand Down Expand Up @@ -372,7 +372,7 @@ static void mxs_dma_free_chan_resources(struct dma_chan *chan)
dma_free_coherent(mxs_dma->dma_device.dev, PAGE_SIZE,
mxs_chan->ccw, mxs_chan->ccw_phys);

clk_disable(mxs_dma->clk);
clk_disable_unprepare(mxs_dma->clk);
}

static struct dma_async_tx_descriptor *mxs_dma_prep_slave_sg(
Expand Down Expand Up @@ -578,7 +578,7 @@ static int __init mxs_dma_init(struct mxs_dma_engine *mxs_dma)
{
int ret;

ret = clk_enable(mxs_dma->clk);
ret = clk_prepare_enable(mxs_dma->clk);
if (ret)
goto err_out;

Expand All @@ -604,7 +604,7 @@ static int __init mxs_dma_init(struct mxs_dma_engine *mxs_dma)
writel(MXS_DMA_CHANNELS_MASK << MXS_DMA_CHANNELS,
mxs_dma->base + HW_APBHX_CTRL1 + MXS_SET_ADDR);

clk_disable(mxs_dma->clk);
clk_disable_unprepare(mxs_dma->clk);

return 0;

Expand Down
10 changes: 5 additions & 5 deletions drivers/mmc/host/mxs-mmc.c
Original file line number Diff line number Diff line change
Expand Up @@ -713,7 +713,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
ret = PTR_ERR(host->clk);
goto out_iounmap;
}
clk_enable(host->clk);
clk_prepare_enable(host->clk);

mxs_mmc_reset(host);

Expand Down Expand Up @@ -772,7 +772,7 @@ static int mxs_mmc_probe(struct platform_device *pdev)
if (host->dmach)
dma_release_channel(host->dmach);
out_clk_put:
clk_disable(host->clk);
clk_disable_unprepare(host->clk);
clk_put(host->clk);
out_iounmap:
iounmap(host->base);
Expand All @@ -798,7 +798,7 @@ static int mxs_mmc_remove(struct platform_device *pdev)
if (host->dmach)
dma_release_channel(host->dmach);

clk_disable(host->clk);
clk_disable_unprepare(host->clk);
clk_put(host->clk);

iounmap(host->base);
Expand All @@ -819,7 +819,7 @@ static int mxs_mmc_suspend(struct device *dev)

ret = mmc_suspend_host(mmc);

clk_disable(host->clk);
clk_disable_unprepare(host->clk);

return ret;
}
Expand All @@ -830,7 +830,7 @@ static int mxs_mmc_resume(struct device *dev)
struct mxs_mmc_host *host = mmc_priv(mmc);
int ret = 0;

clk_enable(host->clk);
clk_prepare_enable(host->clk);

ret = mmc_resume_host(mmc);

Expand Down
12 changes: 6 additions & 6 deletions drivers/mtd/nand/gpmi-nand/gpmi-lib.c
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,7 @@ int gpmi_init(struct gpmi_nand_data *this)
struct resources *r = &this->resources;
int ret;

ret = clk_enable(r->clock);
ret = clk_prepare_enable(r->clock);
if (ret)
goto err_out;
ret = gpmi_reset_block(r->gpmi_regs, false);
Expand All @@ -146,7 +146,7 @@ int gpmi_init(struct gpmi_nand_data *this)
/* Select BCH ECC. */
writel(BM_GPMI_CTRL1_BCH_MODE, r->gpmi_regs + HW_GPMI_CTRL1_SET);

clk_disable(r->clock);
clk_disable_unprepare(r->clock);
return 0;
err_out:
return ret;
Expand Down Expand Up @@ -202,7 +202,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
ecc_strength = bch_geo->ecc_strength >> 1;
page_size = bch_geo->page_size;

ret = clk_enable(r->clock);
ret = clk_prepare_enable(r->clock);
if (ret)
goto err_out;

Expand All @@ -229,7 +229,7 @@ int bch_set_geometry(struct gpmi_nand_data *this)
writel(BM_BCH_CTRL_COMPLETE_IRQ_EN,
r->bch_regs + HW_BCH_CTRL_SET);

clk_disable(r->clock);
clk_disable_unprepare(r->clock);
return 0;
err_out:
return ret;
Expand Down Expand Up @@ -704,7 +704,7 @@ void gpmi_begin(struct gpmi_nand_data *this)
int ret;

/* Enable the clock. */
ret = clk_enable(r->clock);
ret = clk_prepare_enable(r->clock);
if (ret) {
pr_err("We failed in enable the clk\n");
goto err_out;
Expand Down Expand Up @@ -773,7 +773,7 @@ void gpmi_begin(struct gpmi_nand_data *this)
void gpmi_end(struct gpmi_nand_data *this)
{
struct resources *r = &this->resources;
clk_disable(r->clock);
clk_disable_unprepare(r->clock);
}

/* Clears a BCH interrupt. */
Expand Down
10 changes: 5 additions & 5 deletions drivers/net/can/flexcan.c
Original file line number Diff line number Diff line change
Expand Up @@ -802,7 +802,7 @@ static int flexcan_open(struct net_device *dev)
struct flexcan_priv *priv = netdev_priv(dev);
int err;

clk_enable(priv->clk);
clk_prepare_enable(priv->clk);

err = open_candev(dev);
if (err)
Expand All @@ -824,7 +824,7 @@ static int flexcan_open(struct net_device *dev)
out_close:
close_candev(dev);
out:
clk_disable(priv->clk);
clk_disable_unprepare(priv->clk);

return err;
}
Expand All @@ -838,7 +838,7 @@ static int flexcan_close(struct net_device *dev)
flexcan_chip_stop(dev);

free_irq(dev->irq, dev);
clk_disable(priv->clk);
clk_disable_unprepare(priv->clk);

close_candev(dev);

Expand Down Expand Up @@ -877,7 +877,7 @@ static int __devinit register_flexcandev(struct net_device *dev)
struct flexcan_regs __iomem *regs = priv->base;
u32 reg, err;

clk_enable(priv->clk);
clk_prepare_enable(priv->clk);

/* select "bus clock", chip must be disabled */
flexcan_chip_disable(priv);
Expand Down Expand Up @@ -911,7 +911,7 @@ static int __devinit register_flexcandev(struct net_device *dev)
out:
/* disable core and turn off clocks */
flexcan_chip_disable(priv);
clk_disable(priv->clk);
clk_disable_unprepare(priv->clk);

return err;
}
Expand Down
10 changes: 5 additions & 5 deletions drivers/net/ethernet/freescale/fec.c
Original file line number Diff line number Diff line change
Expand Up @@ -1591,7 +1591,7 @@ fec_probe(struct platform_device *pdev)
ret = PTR_ERR(fep->clk);
goto failed_clk;
}
clk_enable(fep->clk);
clk_prepare_enable(fep->clk);

ret = fec_enet_init(ndev);
if (ret)
Expand All @@ -1614,7 +1614,7 @@ fec_probe(struct platform_device *pdev)
fec_enet_mii_remove(fep);
failed_mii_init:
failed_init:
clk_disable(fep->clk);
clk_disable_unprepare(fep->clk);
clk_put(fep->clk);
failed_clk:
for (i = 0; i < FEC_IRQ_NUM; i++) {
Expand All @@ -1641,7 +1641,7 @@ fec_drv_remove(struct platform_device *pdev)

fec_stop(ndev);
fec_enet_mii_remove(fep);
clk_disable(fep->clk);
clk_disable_unprepare(fep->clk);
clk_put(fep->clk);
iounmap(fep->hwp);
unregister_netdev(ndev);
Expand All @@ -1667,7 +1667,7 @@ fec_suspend(struct device *dev)
fec_stop(ndev);
netif_device_detach(ndev);
}
clk_disable(fep->clk);
clk_disable_unprepare(fep->clk);

return 0;
}
Expand All @@ -1678,7 +1678,7 @@ fec_resume(struct device *dev)
struct net_device *ndev = dev_get_drvdata(dev);
struct fec_enet_private *fep = netdev_priv(ndev);

clk_enable(fep->clk);
clk_prepare_enable(fep->clk);
if (netif_running(ndev)) {
fec_restart(ndev, fep->full_duplex);
netif_device_attach(ndev);
Expand Down
Loading

0 comments on commit 8c3b229

Please sign in to comment.