本文整理汇总了C++中clk_put函数的典型用法代码示例。如果您正苦于以下问题:C++ clk_put函数的具体用法?C++ clk_put怎么用?C++ clk_put使用的例子?那么恭喜您, 这里精选的函数代码示例或许可以为您提供帮助。
在下文中一共展示了clk_put函数的20个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的C++代码示例。
示例1: usb_hcd_at91_probe
/**
* usb_hcd_at91_probe - initialize AT91-based HCDs
* Context: !in_interrupt()
*
* Allocates basic resources for this USB host controller, and
* then invokes the start() method for the HCD associated with it
* through the hotplug entry's driver_data.
*/
static int usb_hcd_at91_probe(const struct hc_driver *driver,
struct platform_device *pdev)
{
int retval;
struct usb_hcd *hcd = NULL;
if (pdev->num_resources != 2) {
pr_debug("hcd probe: invalid num_resources");
return -ENODEV;
}
if ((pdev->resource[0].flags != IORESOURCE_MEM)
|| (pdev->resource[1].flags != IORESOURCE_IRQ)) {
pr_debug("hcd probe: invalid resource type\n");
return -ENODEV;
}
hcd = usb_create_hcd(driver, &pdev->dev, "at91");
if (!hcd)
return -ENOMEM;
hcd->rsrc_start = pdev->resource[0].start;
hcd->rsrc_len = pdev->resource[0].end - pdev->resource[0].start + 1;
if (!request_mem_region(hcd->rsrc_start, hcd->rsrc_len, hcd_name)) {
pr_debug("request_mem_region failed\n");
retval = -EBUSY;
goto err1;
}
hcd->regs = ioremap(hcd->rsrc_start, hcd->rsrc_len);
if (!hcd->regs) {
pr_debug("ioremap failed\n");
retval = -EIO;
goto err2;
}
iclk = clk_get(&pdev->dev, "ohci_clk");
fclk = clk_get(&pdev->dev, "uhpck");
if (cpu_is_at91sam9261())
hclk = clk_get(&pdev->dev, "hck0");
at91_start_hc(pdev);
ohci_hcd_init(hcd_to_ohci(hcd));
retval = usb_add_hcd(hcd, pdev->resource[1].start, IRQF_SHARED);
if (retval == 0)
return retval;
/* Error handling */
at91_stop_hc(pdev);
if (cpu_is_at91sam9261())
clk_put(hclk);
clk_put(fclk);
clk_put(iclk);
iounmap(hcd->regs);
err2:
release_mem_region(hcd->rsrc_start, hcd->rsrc_len);
err1:
usb_put_hcd(hcd);
return retval;
}
开发者ID:325116067,项目名称:semc-qsd8x50,代码行数:73,代码来源:ohci-at91.c
示例2: serial_pxa_probe
static int serial_pxa_probe(struct platform_device *dev)
{
struct uart_pxa_port *sport;
struct resource *mmres, *irqres;
int ret;
mmres = platform_get_resource(dev, IORESOURCE_MEM, 0);
irqres = platform_get_resource(dev, IORESOURCE_IRQ, 0);
if (!mmres || !irqres)
return -ENODEV;
sport = kzalloc(sizeof(struct uart_pxa_port), GFP_KERNEL);
if (!sport)
return -ENOMEM;
sport->clk = clk_get(&dev->dev, NULL);
if (IS_ERR(sport->clk)) {
ret = PTR_ERR(sport->clk);
goto err_free;
}
ret = clk_prepare(sport->clk);
if (ret) {
clk_put(sport->clk);
goto err_free;
}
sport->port.type = PORT_PXA;
sport->port.iotype = UPIO_MEM;
sport->port.mapbase = mmres->start;
sport->port.irq = irqres->start;
sport->port.fifosize = 64;
sport->port.ops = &serial_pxa_pops;
sport->port.dev = &dev->dev;
sport->port.flags = UPF_IOREMAP | UPF_BOOT_AUTOCONF;
sport->port.uartclk = clk_get_rate(sport->clk);
ret = serial_pxa_probe_dt(dev, sport);
if (ret > 0)
sport->port.line = dev->id;
else if (ret < 0)
goto err_clk;
snprintf(sport->name, PXA_NAME_LEN - 1, "UART%d", sport->port.line + 1);
sport->port.membase = ioremap(mmres->start, resource_size(mmres));
if (!sport->port.membase) {
ret = -ENOMEM;
goto err_clk;
}
serial_pxa_ports[sport->port.line] = sport;
uart_add_one_port(&serial_pxa_reg, &sport->port);
platform_set_drvdata(dev, sport);
return 0;
err_clk:
clk_unprepare(sport->clk);
clk_put(sport->clk);
err_free:
kfree(sport);
return ret;
}
开发者ID:ReneNyffenegger,项目名称:linux,代码行数:64,代码来源:pxa.c
示例3: tegra30_spdif_platform_probe
static __devinit int tegra30_spdif_platform_probe(struct platform_device *pdev)
{
struct tegra30_spdif *spdif;
struct resource *mem, *memregion;
int ret;
u32 reg_val;
spdif = kzalloc(sizeof(struct tegra30_spdif), GFP_KERNEL);
if (!spdif) {
#if HDMI_DEBUG
printk("HDMI_DEBUG: Can't allocate tegra30_spdif\n");
#endif
dev_err(&pdev->dev, "Can't allocate tegra30_spdif\n");
ret = -ENOMEM;
goto exit;
}
dev_set_drvdata(&pdev->dev, spdif);
spdif->clk_spdif_out = clk_get(&pdev->dev, "spdif_out");
if (IS_ERR(spdif->clk_spdif_out)) {
#if HDMI_DEBUG
printk("HDMI_DEBUG: Can't retrieve spdif clock\n");
#endif
dev_err(&pdev->dev, "Can't retrieve spdif clock\n");
ret = PTR_ERR(spdif->clk_spdif_out);
goto err_free;
}
mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!mem) {
#if HDMI_DEBUG
printk("HDMI_DEBUG: No memory resource\n");
#endif
dev_err(&pdev->dev, "No memory resource\n");
ret = -ENODEV;
goto err_clk_put_spdif;
}
memregion = request_mem_region(mem->start, resource_size(mem),
DRV_NAME);
if (!memregion) {
#if HDMI_DEBUG
printk("HDMI_DEBUG: Memory region already claimed\n");
#endif
dev_err(&pdev->dev, "Memory region already claimed\n");
ret = -EBUSY;
goto err_clk_put_spdif;
}
spdif->regs = ioremap(mem->start, resource_size(mem));
if (!spdif->regs) {
#if HDMI_DEBUG
printk("HDMI_DEBUG: ioremap failed\n");
#endif
dev_err(&pdev->dev, "ioremap failed\n");
ret = -ENOMEM;
goto err_release;
}
tegra30_spdif_enable_clocks(spdif);
reg_val = TEGRA30_SPDIF_CIF_TXD_CTRL_DIRECTION_RXCIF |
TEGRA30_SPDIF_CIF_TXD_CTRL_AUDIO_BIT16 |
TEGRA30_SPDIF_CIF_TXD_CTRL_CLIENT_BIT16 |
TEGRA30_SPDIF_CIF_TXD_CTRL_AUDIO_CH2 |
TEGRA30_SPDIF_CIF_TXD_CTRL_CLIENT_CH2 |
(3 << TEGRA30_SPDIF_CIF_TXD_CTRL_FIFO_TH_SHIFT);
tegra30_spdif_write(spdif, TEGRA30_SPDIF_CIF_TXD_CTRL, reg_val);
tegra30_spdif_disable_clocks(spdif);
ret = snd_soc_register_dai(&pdev->dev, &tegra30_spdif_dai);
if (ret) {
#if HDMI_DEBUG
printk("HDMI_DEBUG: Could not register DAI: %d\n", ret);
#endif
dev_err(&pdev->dev, "Could not register DAI: %d\n", ret);
ret = -ENOMEM;
goto err_unmap;
}
tegra30_spdif_debug_add(spdif);
return 0;
err_unmap:
iounmap(spdif->regs);
err_release:
release_mem_region(mem->start, resource_size(mem));
err_clk_put_spdif:
clk_put(spdif->clk_spdif_out);
err_free:
kfree(spdif);
exit:
return ret;
}
开发者ID:HuChundong,项目名称:Endeavor3.1.10,代码行数:97,代码来源:tegra30_spdif.c
示例4: s3c2410wdt_probe
//.........这里部分代码省略.........
wdt_irq = platform_get_resource(pdev, IORESOURCE_IRQ, 0);
if (wdt_irq == NULL) {
dev_err(dev, "no irq resource specified\n");
ret = -ENOENT;
goto err_map;
}
ret = request_irq(wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev);
if (ret != 0) {
dev_err(dev, "failed to install irq (%d)\n", ret);
goto err_map;
}
wdt_clock = clk_get(&pdev->dev, "watchdog");
if (IS_ERR(wdt_clock)) {
dev_err(dev, "failed to find watchdog clock source\n");
ret = PTR_ERR(wdt_clock);
goto err_irq;
}
clk_enable(wdt_clock);
if (s3c2410wdt_cpufreq_register() < 0) {
printk(KERN_ERR PFX "failed to register cpufreq\n");
goto err_clk;
}
/* see if we can actually set the requested timer margin, and if
* not, try the default value */
if (s3c2410wdt_set_heartbeat(tmr_margin)) {
started = s3c2410wdt_set_heartbeat(CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME);
if (started == 0)
dev_info(dev,
"tmr_margin value out of range, default %d used\n",
CONFIG_S3C2410_WATCHDOG_DEFAULT_TIME);
else
dev_info(dev, "default timer value is out of range, cannot start\n");
}
ret = misc_register(&s3c2410wdt_miscdev);
if (ret) {
dev_err(dev, "cannot register miscdev on minor=%d (%d)\n",
WATCHDOG_MINOR, ret);
goto err_cpufreq;
}
if (tmr_atboot && started == 0) {
dev_info(dev, "starting watchdog timer\n");
DEBG("--------------- starting watchdog timer: timeout = %d --------------\n", tmr_margin);
s3c2410wdt_start();
#ifdef CONFIG_START_S3C2410_WDT_AT_BOOT
wdt_ktd = kthread_create(wdt_thread, NULL, "s3c2410_watchdog_thread");
if (wdt_ktd == (struct task_struct*)ERR_PTR) {
wdt_ktd = NULL;
DEBG("--- kthread create, error ---\n");
} else {
wake_up_process(wdt_ktd);
}
#endif
} else if (!tmr_atboot) {
/* if we're not enabling the watchdog, then ensure it is
* disabled if it has been left running from the bootloader
* or other source */
DEBG("--- not starting watchdog timer at boot time ---\n");
s3c2410wdt_stop();
}
/* print out a statement of readiness */
wtcon = readl(wdt_base + S3C2410_WTCON);
dev_info(dev, "watchdog %sactive, reset %sabled, irq %sabled\n",
(wtcon & S3C2410_WTCON_ENABLE) ? "" : "in",
(wtcon & S3C2410_WTCON_RSTEN) ? "" : "dis",
(wtcon & S3C2410_WTCON_INTEN) ? "" : "en");
return 0;
err_cpufreq:
s3c2410wdt_cpufreq_deregister();
err_clk:
clk_disable(wdt_clock);
clk_put(wdt_clock);
err_irq:
free_irq(wdt_irq->start, pdev);
err_map:
iounmap(wdt_base);
err_req:
release_resource(wdt_mem);
kfree(wdt_mem);
return ret;
}
开发者ID:jhlxz2003,项目名称:kernel-2.6.35,代码行数:101,代码来源:s3c2410_wdt.c
示例5: playpaq_asoc_init
static int __init playpaq_asoc_init(void)
{
int ret = 0;
struct at32_ssc_info *ssc_p = playpaq_wm8510_dai.cpu_dai->private_data;
struct ssc_device *ssc = NULL;
/*
* Request SSC device
*/
ssc = ssc_request(0);
if (IS_ERR(ssc)) {
ret = PTR_ERR(ssc);
goto err_ssc;
}
ssc_p->ssc = ssc;
/*
* Configure MCLK for WM8510
*/
_gclk0 = clk_get(NULL, "gclk0");
if (IS_ERR(_gclk0)) {
_gclk0 = NULL;
goto err_gclk0;
}
_pll0 = clk_get(NULL, "pll0");
if (IS_ERR(_pll0)) {
_pll0 = NULL;
goto err_pll0;
}
if (clk_set_parent(_gclk0, _pll0)) {
pr_warning("snd-soc-playpaq: "
"Failed to set PLL0 as parent for DAC clock\n");
goto err_set_clk;
}
clk_set_rate(CODEC_CLK, 12000000);
clk_enable(CODEC_CLK);
#if defined CONFIG_AT32_ENHANCED_PORTMUX
at32_select_periph(MCLK_PIN, MCLK_PERIPH, 0);
#endif
/*
* Create and register platform device
*/
playpaq_snd_device = platform_device_alloc("soc-audio", 0);
if (playpaq_snd_device == NULL) {
ret = -ENOMEM;
goto err_device_alloc;
}
platform_set_drvdata(playpaq_snd_device, &playpaq_wm8510_snd_devdata);
playpaq_wm8510_snd_devdata.dev = &playpaq_snd_device->dev;
ret = platform_device_add(playpaq_snd_device);
if (ret) {
pr_warning("playpaq_wm8510: platform_device_add failed (%d)\n",
ret);
goto err_device_add;
}
return 0;
err_device_add:
if (playpaq_snd_device != NULL) {
platform_device_put(playpaq_snd_device);
playpaq_snd_device = NULL;
}
err_device_alloc:
err_set_clk:
if (_pll0 != NULL) {
clk_put(_pll0);
_pll0 = NULL;
}
err_pll0:
if (_gclk0 != NULL) {
clk_put(_gclk0);
_gclk0 = NULL;
}
err_gclk0:
ssc_free(ssc);
err_ssc:
return ret;
}
开发者ID:kizukukoto,项目名称:WDN900_GPL,代码行数:87,代码来源:playpaq_wm8510.c
示例6: mxc_rtc_probe
/*! MXC RTC Power management control */
static int mxc_rtc_probe(struct platform_device *pdev)
{
struct clk *clk;
struct timespec tv;
struct resource *res;
struct rtc_device *rtc;
struct rtc_drv_data *pdata = NULL;
struct mxc_srtc_platform_data *plat_data = NULL;
void __iomem *ioaddr;
void __iomem *srtc_secmode_addr;
int ret = 0;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res)
return -ENODEV;
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
if (!pdata)
return -ENOMEM;
pdata->clk = clk_get(&pdev->dev, "rtc_clk");
clk_enable(pdata->clk);
pdata->baseaddr = res->start;
pdata->ioaddr = ioremap(pdata->baseaddr, 0x40);
ioaddr = pdata->ioaddr;
/* Configure and enable the RTC */
pdata->irq = platform_get_irq(pdev, 0);
if (pdata->irq >= 0) {
if (request_irq(pdata->irq, mxc_rtc_interrupt, IRQF_SHARED,
pdev->name, pdev) < 0) {
dev_warn(&pdev->dev, "interrupt not available.\n");
pdata->irq = -1;
} else {
disable_irq(pdata->irq);
pdata->irq_enable = false;
}
}
clk = clk_get(NULL, "rtc_clk");
if (clk_get_rate(clk) != 32768) {
printk(KERN_ALERT "rtc clock is not valid");
ret = -EINVAL;
clk_put(clk);
goto err_out;
}
clk_put(clk);
/* initialize glitch detect */
__raw_writel(SRTC_LPPDR_INIT, ioaddr + SRTC_LPPDR);
udelay(100);
/* clear lp interrupt status */
__raw_writel(0xFFFFFFFF, ioaddr + SRTC_LPSR);
udelay(100);
plat_data = (struct mxc_srtc_platform_data *)pdev->dev.platform_data;
/* move out of init state */
__raw_writel((SRTC_LPCR_IE | SRTC_LPCR_NSA),
ioaddr + SRTC_LPCR);
udelay(100);
while ((__raw_readl(ioaddr + SRTC_LPSR) & SRTC_LPSR_IES) == 0)
;
/* move out of non-valid state */
__raw_writel((SRTC_LPCR_IE | SRTC_LPCR_NVE | SRTC_LPCR_NSA |
SRTC_LPCR_EN_LP), ioaddr + SRTC_LPCR);
udelay(100);
while ((__raw_readl(ioaddr + SRTC_LPSR) & SRTC_LPSR_NVES) == 0)
;
__raw_writel(0xFFFFFFFF, ioaddr + SRTC_LPSR);
udelay(100);
rtc = rtc_device_register(pdev->name, &pdev->dev,
&mxc_rtc_ops, THIS_MODULE);
if (IS_ERR(rtc)) {
ret = PTR_ERR(rtc);
goto err_out;
}
pdata->rtc = rtc;
platform_set_drvdata(pdev, pdata);
tv.tv_nsec = 0;
tv.tv_sec = __raw_readl(ioaddr + SRTC_LPSCMR);
/* By default, devices should wakeup if they can */
/* So srtc is set as "should wakeup" as it can */
device_init_wakeup(&pdev->dev, 1);
clk_disable(pdata->clk);
return ret;
//.........这里部分代码省略.........
开发者ID:fwmfee,项目名称:linux-legacy,代码行数:101,代码来源:rtc-mxc_v2.c
示例7: sdhci_zynq_probe
static int sdhci_zynq_probe(struct platform_device *pdev)
{
int ret;
int irq = platform_get_irq(pdev, 0);
const void *prop;
struct device_node *np = pdev->dev.of_node;
struct sdhci_host *host;
struct sdhci_pltfm_host *pltfm_host;
struct xsdhcips *xsdhcips;
xsdhcips = kmalloc(sizeof(*xsdhcips), GFP_KERNEL);
if (!xsdhcips) {
dev_err(&pdev->dev, "unable to allocate memory\n");
return -ENOMEM;
}
if (irq == 56)
xsdhcips->aperclk = clk_get_sys("SDIO0_APER", NULL);
else
xsdhcips->aperclk = clk_get_sys("SDIO1_APER", NULL);
if (IS_ERR(xsdhcips->aperclk)) {
dev_err(&pdev->dev, "APER clock not found.\n");
ret = PTR_ERR(xsdhcips->aperclk);
goto err_free;
}
if (irq == 56)
xsdhcips->devclk = clk_get_sys("SDIO0", NULL);
else
xsdhcips->devclk = clk_get_sys("SDIO1", NULL);
if (IS_ERR(xsdhcips->devclk)) {
dev_err(&pdev->dev, "Device clock not found.\n");
ret = PTR_ERR(xsdhcips->devclk);
goto clk_put_aper;
}
ret = clk_prepare_enable(xsdhcips->aperclk);
if (ret) {
dev_err(&pdev->dev, "Unable to enable APER clock.\n");
goto clk_put;
}
ret = clk_prepare_enable(xsdhcips->devclk);
if (ret) {
dev_err(&pdev->dev, "Unable to enable device clock.\n");
goto clk_dis_aper;
}
xsdhcips->clk_rate_change_nb.notifier_call = xsdhcips_clk_notifier_cb;
xsdhcips->clk_rate_change_nb.next = NULL;
if (clk_notifier_register(xsdhcips->devclk,
&xsdhcips->clk_rate_change_nb))
dev_warn(&pdev->dev, "Unable to register clock notifier.\n");
ret = sdhci_pltfm_register(pdev, &sdhci_zynq_pdata);
if (ret) {
dev_err(&pdev->dev, "Platform registration failed\n");
goto clk_notif_unreg;
}
host = platform_get_drvdata(pdev);
pltfm_host = sdhci_priv(host);
pltfm_host->priv = xsdhcips;
prop = of_get_property(np, "xlnx,has-cd", NULL);
if (prop == NULL || (!(u32) be32_to_cpup(prop)))
host->quirks |= SDHCI_QUIRK_BROKEN_CARD_DETECTION;
return 0;
clk_notif_unreg:
clk_notifier_unregister(xsdhcips->devclk,
&xsdhcips->clk_rate_change_nb);
clk_disable_unprepare(xsdhcips->devclk);
clk_dis_aper:
clk_disable_unprepare(xsdhcips->aperclk);
clk_put:
clk_put(xsdhcips->devclk);
clk_put_aper:
clk_put(xsdhcips->aperclk);
err_free:
kfree(xsdhcips);
return ret;
}
开发者ID:FadyAzar,项目名称:linux-te-3.9,代码行数:88,代码来源:sdhci-of-xilinxps.c
示例8: loongson2_cpufreq_exit
static int loongson2_cpufreq_exit(struct cpufreq_policy *policy)
{
cpufreq_frequency_table_put_attr(policy->cpu);
clk_put(policy->clk);
return 0;
}
开发者ID:BeanGu,项目名称:linux,代码行数:6,代码来源:loongson2_cpufreq.c
示例9: s3c_i2s_set_sysclk
//.........这里部分代码省略.........
67738000 mod 2822400 = 400
16000 x 256 = 4096000
49152000 mod 4096000 = 0
32768000 mod 4096000 = 0
73728000 mod 4096000 = 0
22050 x 256 = 5644800
67738000 mod 5644800 = 400
32000 x 256 = 8192000
49152000 mod 8192000 = 0
32768000 mod 8192000 = 0
73728000 mod 8192000 = 0
44100 x 256 = 11289600
67738000 mod 11289600 = 400
48000 x 256 = 12288000
49152000 mod 12288000 = 0
73728000 mod 12288000 = 0
64000 x 256 = 16384000
49152000 mod 16384000 = 0
32768000 mod 16384000 = 0
88200 x 256 = 22579200
67738000 mod 22579200 = 400
96000 x 256 = 24576000
49152000 mod 24576000 = 0
73728000 mod 24576000 = 0
From the table above, we find that 49152000 gives least(0) residue
for most sample rates, followed by 67738000.
*/
clk = clk_get(NULL, "fout_epll");
if (IS_ERR(clk)) {
printk("failed to get FOUTepll\n");
return -EBUSY;
}
clk_disable(clk);
switch (freq) {
case 8000:
#ifdef CONFIG_SND_S3C64XX_SOC_I2S_REC_DOWNSAMPLING // sangsu fix
clk_set_rate(clk, 67738000);
break;
#endif // sangsu fix
case 16000:
case 32000:
case 48000:
case 64000:
case 96000:
clk_set_rate(clk, 49152000);
break;
case 11025:
case 22050:
case 44100:
case 88200:
default:
clk_set_rate(clk, 67738000);
break;
}
clk_enable(clk);
s3c_i2s.clk_rate = clk_get_rate(s3c_i2s.audio_bus);
//printk("Setting FOUTepll to %dHz", s3c_i2s.clk_rate);
clk_put(clk);
break;
#endif
case S3C_CLKSRC_SLVPCLK:
case S3C_CLKSRC_I2SEXT:
#if USE_AP_MASTER
if(!s3c_i2s.slave)
{
printk("[warning]slave is not set\n");
return -EINVAL;
}
#endif
iismod &= ~S3C_IISMOD_IMSMASK;
iismod |= clk_id;
break;
/* Not sure about these two! */
case S3C_CDCLKSRC_INT:
iismod &= ~S3C_IISMOD_CDCLKCON;
break;
case S3C_CDCLKSRC_EXT:
iismod |= S3C_IISMOD_CDCLKCON;
break;
default:
return -EINVAL;
}
writel(iismod, s3c_i2s.regs + S3C_IISMOD);
return 0;
}
开发者ID:Astinj,项目名称:I5700-kernel-2.6.32.9,代码行数:101,代码来源:s3c6410-i2s.c
示例10: s3c_i2s_probe
static int s3c_i2s_probe(struct platform_device *pdev,
struct snd_soc_dai *dai)
{
int ret = 0;
#if USE_CLKAUDIO
struct clk *cm, *cf;
#endif
debug_msg("%s\n", __FUNCTION__);
s3c_i2s.regs = ioremap(S3C_IIS_PABASE, 0x100);
/* Configure the I2S pins in correct mode */
s3c_gpio_cfgpin(GPIO_I2S_LRCLK, S3C_GPIO_SFN(GPIO_I2S_LRCLK_AF));
s3c_gpio_cfgpin(GPIO_I2S_CLK, S3C_GPIO_SFN(GPIO_I2S_CLK_AF));
s3c_gpio_cfgpin(GPIO_I2S_DI, S3C_GPIO_SFN(GPIO_I2S_DI_AF));
s3c_gpio_cfgpin(GPIO_I2S_DO, S3C_GPIO_SFN(GPIO_I2S_DO_AF));
/* pull-up-enable, pull-down-disable*/
s3c_gpio_setpull(GPIO_I2S_CLK, S3C_GPIO_PULL_UP);
s3c_gpio_setpull(GPIO_I2S_LRCLK, S3C_GPIO_PULL_UP);
s3c_gpio_setpull(GPIO_I2S_DI, S3C_GPIO_PULL_UP);
s3c_gpio_setpull(GPIO_I2S_DO, S3C_GPIO_PULL_UP);
if (s3c_i2s.regs == NULL)
return -ENXIO;
ret = request_irq(S3C_IISIRQ, s3c_iis_irq, 0, "s3c-i2s", pdev);
if (ret < 0) {
printk("fail to claim i2s irq , ret = %d\n", ret);
iounmap(s3c_i2s.regs);
return -ENODEV;
}
s3c_i2s.iis_clk = clk_get(&pdev->dev, PCLKCLK);
if (IS_ERR(s3c_i2s.iis_clk)) {
printk("failed to get clk(%s)\n", PCLKCLK);
goto lb5;
}
clk_enable(s3c_i2s.iis_clk);
s3c_i2s.clk_rate = clk_get_rate(s3c_i2s.iis_clk);
#if USE_CLKAUDIO
s3c_i2s.audio_bus = clk_get(NULL, EXTCLK);
if (IS_ERR(s3c_i2s.audio_bus)) {
printk("failed to get clk(%s)\n", EXTCLK);
goto lb4;
}
cm = clk_get(NULL, "mout_epll");
if (IS_ERR(cm)) {
printk("failed to get mout_epll\n");
goto lb3;
}
if(clk_set_parent(s3c_i2s.audio_bus, cm)){
printk("failed to set MOUTepll as parent of CLKAUDIO0\n");
goto lb2;
}
cf = clk_get(NULL, "fout_epll");
if (IS_ERR(cf)) {
printk("failed to get fout_epll\n");
goto lb2;
}
clk_enable(cf);
if(clk_set_parent(cm, cf)){
printk("failed to set FOUTepll as parent of MOUTepll\n");
goto lb1;
}
s3c_i2s.clk_rate = clk_get_rate(s3c_i2s.audio_bus);
clk_put(cf);
clk_put(cm);
#endif
#if defined(CONFIG_SND_S3C_I2S_V50)
writel(readl(s3c_i2s.regs + S3C_IISCON) | S3C_IISCON_SWRESET, s3c_i2s.regs + S3C_IISCON);
#else
writel(S3C_IISCON_I2SACTIVE, s3c_i2s.regs + S3C_IISCON);
#endif
s3c_snd_txctrl(0);
s3c_snd_rxctrl(0);
return 0;
#if USE_CLKAUDIO
lb1:
clk_put(cf);
lb2:
clk_put(cm);
lb3:
clk_put(s3c_i2s.audio_bus);
lb4:
clk_disable(s3c_i2s.iis_clk);
clk_put(s3c_i2s.iis_clk);
#endif
lb5:
free_irq(S3C_IISIRQ, pdev);
//.........这里部分代码省略.........
开发者ID:Astinj,项目名称:I5700-kernel-2.6.32.9,代码行数:101,代码来源:s3c6410-i2s.c
示例11: at91_mci_probe
//.........这里部分代码省略.........
ret = gpio_request(host->board->vcc_pin, "mmc_vcc");
if (ret < 0) {
dev_dbg(&pdev->dev, "couldn't claim vcc switch pin\n");
goto fail3;
}
}
/*
* Get Clock
*/
host->mci_clk = clk_get(&pdev->dev, "mci_clk");
if (IS_ERR(host->mci_clk)) {
ret = -ENODEV;
dev_dbg(&pdev->dev, "no mci_clk?\n");
goto fail2;
}
/*
* Map I/O region
*/
host->baseaddr = ioremap(res->start, resource_size(res));
if (!host->baseaddr) {
ret = -ENOMEM;
goto fail1;
}
/*
* Reset hardware
*/
clk_enable(host->mci_clk); /* Enable the peripheral clock */
at91_mci_disable(host);
at91_mci_enable(host);
/*
* Allocate the MCI interrupt
*/
host->irq = platform_get_irq(pdev, 0);
ret = request_irq(host->irq, at91_mci_irq, IRQF_SHARED,
mmc_hostname(mmc), host);
if (ret) {
dev_dbg(&pdev->dev, "request MCI interrupt failed\n");
goto fail0;
}
setup_timer(&host->timer, at91_timeout_timer, (unsigned long)host);
platform_set_drvdata(pdev, mmc);
/*
* Add host to MMC layer
*/
if (host->board->det_pin) {
host->present = !gpio_get_value(host->board->det_pin);
}
else
host->present = -1;
mmc_add_host(mmc);
/*
* monitor card insertion/removal if we can
*/
if (host->board->det_pin) {
ret = request_irq(gpio_to_irq(host->board->det_pin),
at91_mmc_det_irq, 0, mmc_hostname(mmc), host);
if (ret)
dev_warn(&pdev->dev, "request MMC detect irq failed\n");
else
device_init_wakeup(&pdev->dev, 1);
}
pr_debug("Added MCI driver\n");
return 0;
fail0:
clk_disable(host->mci_clk);
iounmap(host->baseaddr);
fail1:
clk_put(host->mci_clk);
fail2:
if (host->board->vcc_pin)
gpio_free(host->board->vcc_pin);
fail3:
if (host->board->wp_pin)
gpio_free(host->board->wp_pin);
fail4:
if (host->board->det_pin)
gpio_free(host->board->det_pin);
fail4b:
if (host->buffer)
dma_free_coherent(&pdev->dev, MCI_BUFSIZE,
host->buffer, host->physical_address);
fail5:
mmc_free_host(mmc);
fail6:
release_mem_region(res->start, resource_size(res));
dev_err(&pdev->dev, "probe failed, err %d\n", ret);
return ret;
}
开发者ID:CSCLOG,项目名称:beaglebone,代码行数:101,代码来源:at91_mci.c
示例12: exynos_ohci_probe
static int __devinit exynos_ohci_probe(struct platform_device *pdev)
{
struct s5p_ohci_platdata *pdata;
struct exynos_ohci_hcd *exynos_ohci;
struct usb_hcd *hcd;
struct ohci_hcd *ohci;
struct resource *res;
int irq;
int err;
pdata = pdev->dev.platform_data;
if (!pdata) {
dev_err(&pdev->dev, "No platform data defined\n");
return -EINVAL;
}
exynos_ohci = kzalloc(sizeof(struct exynos_ohci_hcd), GFP_KERNEL);
if (!exynos_ohci)
return -ENOMEM;
exynos_ohci->dev = &pdev->dev;
hcd = usb_create_hcd(&exynos_ohci_hc_driver, &pdev->dev,
dev_name(&pdev->dev));
if (!hcd) {
dev_err(&pdev->dev, "Unable to create HCD\n");
err = -ENOMEM;
goto fail_hcd;
}
exynos_ohci->hcd = hcd;
exynos_ohci->clk = clk_get(&pdev->dev, "usbhost");
if (IS_ERR(exynos_ohci->clk)) {
dev_err(&pdev->dev, "Failed to get usbhost clock\n");
err = PTR_ERR(exynos_ohci->clk);
goto fail_clk;
}
err = clk_enable(exynos_ohci->clk);
if (err)
goto fail_clken;
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "Failed to get I/O memory\n");
err = -ENXIO;
goto fail_io;
}
hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res);
hcd->regs = ioremap(res->start, resource_size(res));
if (!hcd->regs) {
dev_err(&pdev->dev, "Failed to remap I/O memory\n");
err = -ENOMEM;
goto fail_io;
}
irq = platform_get_irq(pdev, 0);
if (!irq) {
dev_err(&pdev->dev, "Failed to get IRQ\n");
err = -ENODEV;
goto fail;
}
if (pdata->phy_init)
pdata->phy_init(pdev, S5P_USB_PHY_HOST);
ohci = hcd_to_ohci(hcd);
ohci_hcd_init(ohci);
err = usb_add_hcd(hcd, irq, IRQF_SHARED);
if (err) {
dev_err(&pdev->dev, "Failed to add USB HCD\n");
goto fail;
}
platform_set_drvdata(pdev, exynos_ohci);
return 0;
fail:
iounmap(hcd->regs);
fail_io:
clk_disable(exynos_ohci->clk);
fail_clken:
clk_put(exynos_ohci->clk);
fail_clk:
usb_put_hcd(hcd);
fail_hcd:
kfree(exynos_ohci);
return err;
}
开发者ID:abc2402878,项目名称:linux-tiny210v2,代码行数:94,代码来源:ohci-exynos.c
示例13: sh_mobile_sdhi_probe
//.........这里部分代码省略.........
}
/*
* All SDHI blocks support 2-byte and larger block sizes in 4-bit
* bus width mode.
*/
mmc_data->flags |= TMIO_MMC_BLKSZ_2BYTES;
/*
* All SDHI blocks support SDIO IRQ signalling.
*/
mmc_data->flags |= TMIO_MMC_SDIO_IRQ;
ret = tmio_mmc_host_probe(&host, pdev, mmc_data);
if (ret < 0)
goto eprobe;
/*
* Allow one or more specific (named) ISRs or
* one or more multiplexed (un-named) ISRs.
*/
irq = platform_get_irq_byname(pdev, SH_MOBILE_SDHI_IRQ_CARD_DETECT);
if (irq >= 0) {
multiplexed_isr = false;
ret = request_irq(irq, tmio_mmc_card_detect_irq, 0,
dev_name(&pdev->dev), host);
if (ret)
goto eirq_card_detect;
}
irq = platform_get_irq_byname(pdev, SH_MOBILE_SDHI_IRQ_SDIO);
if (irq >= 0) {
multiplexed_isr = false;
ret = request_irq(irq, tmio_mmc_sdio_irq, 0,
dev_name(&pdev->dev), host);
if (ret)
goto eirq_sdio;
}
irq = platform_get_irq_byname(pdev, SH_MOBILE_SDHI_IRQ_SDCARD);
if (irq >= 0) {
multiplexed_isr = false;
ret = request_irq(irq, tmio_mmc_sdcard_irq, 0,
dev_name(&pdev->dev), host);
if (ret)
goto eirq_sdcard;
} else if (!multiplexed_isr) {
dev_err(&pdev->dev,
"Principal SD-card IRQ is missing among named interrupts\n");
ret = irq;
goto eirq_sdcard;
}
if (multiplexed_isr) {
while (1) {
irq = platform_get_irq(pdev, i);
if (irq < 0)
break;
i++;
ret = request_irq(irq, tmio_mmc_irq, 0,
dev_name(&pdev->dev), host);
if (ret)
goto eirq_multiplexed;
}
/* There must be at least one IRQ source */
if (!i)
goto eirq_multiplexed;
}
dev_info(&pdev->dev, "%s base at 0x%08lx clock rate %u MHz\n",
mmc_hostname(host->mmc), (unsigned long)
(platform_get_resource(pdev,IORESOURCE_MEM, 0)->start),
mmc_data->hclk / 1000000);
return ret;
eirq_multiplexed:
while (i--) {
irq = platform_get_irq(pdev, i);
free_irq(irq, host);
}
eirq_sdcard:
irq = platform_get_irq_byname(pdev, SH_MOBILE_SDHI_IRQ_SDIO);
if (irq >= 0)
free_irq(irq, host);
eirq_sdio:
irq = platform_get_irq_byname(pdev, SH_MOBILE_SDHI_IRQ_CARD_DETECT);
if (irq >= 0)
free_irq(irq, host);
eirq_card_detect:
tmio_mmc_host_remove(host);
eprobe:
clk_disable(priv->clk);
clk_put(priv->clk);
eclkget:
kfree(priv);
return ret;
}
开发者ID:125radheyshyam,项目名称:linux,代码行数:101,代码来源:sh_mobile_sdhi.c
示例14: tegra_ehci_probe
//.........这里部分代码省略.........
udelay(2);
//+Sophia:0608
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
dev_err(&pdev->dev, "failed to get I/O memory\n");
err = -ENXIO;
goto fail_io;
}
hcd->rsrc_start = res->start;
hcd->rsrc_len = resource_size(res);
hcd->regs = ioremap(res->start, resource_size(res));
if (!hcd->regs) {
dev_err(&pdev->dev, "failed to remap I/O memory\n");
err = -ENOMEM;
goto fail_io;
}
irq = platform_get_irq(pdev, 0);
if (irq < 0) {
dev_err(&pdev->dev, "failed to get IRQ\n");
err = -ENODEV;
goto fail_irq;
}
set_irq_flags(irq, IRQF_VALID);
tegra->irq = irq;
tegra->phy = tegra_usb_phy_open(pdev);
if (IS_ERR(tegra->phy)) {
dev_err(&pdev->dev, "failed to open USB phy\n");
err = -ENXIO;
goto fail_irq;
}
err = tegra_usb_phy_power_on(tegra->phy);
if (err) {
dev_err(&pdev->dev, "failed to power on the phy\n");
goto fail_phy;
}
err = tegra_usb_phy_init(tegra->phy);
if (err) {
dev_err(&pdev->dev, "failed to init the phy\n");
goto fail_phy;
}
err = usb_add_hcd(hcd, irq, IRQF_SHARED | IRQF_TRIGGER_HIGH);
if (err) {
dev_err(&pdev->dev, "Failed to add USB HCD, error=%d\n", err);
goto fail_phy;
}
err = enable_irq_wake(tegra->irq);
if (err < 0) {
dev_warn(&pdev->dev,
"Couldn't enable USB host mode wakeup, irq=%d, "
"error=%d\n", irq, err);
err = 0;
tegra->irq = 0;
}
tegra->ehci = hcd_to_ehci(hcd);
//htc++
#ifdef CONFIG_QCT_9K_MODEM
if (Modem_is_QCT_MDM9K())
{
extern struct platform_device tegra_ehci2_device;
if (&tegra_ehci2_device == pdev)
{
mdm_hsic_ehci_hcd = tegra->ehci;
mdm_hsic_usb_hcd = hcd;
mdm_hsic_phy = tegra->phy;
pr_info("%s:: mdm_hsic_ehci_hcd = %x, mdm_hsic_usb_hcd = %x, mdm_hsic_phy = %x\n",
__func__, (unsigned int)mdm_hsic_ehci_hcd, (unsigned int)mdm_hsic_usb_hcd, (unsigned int)mdm_hsic_phy);
}
}
#endif //CONFIG_QCT_9K_MODEM
//htc--
#ifdef CONFIG_USB_OTG_UTILS
if (tegra_usb_phy_otg_supported(tegra->phy)) {
tegra->transceiver = otg_get_transceiver();
if (tegra->transceiver)
otg_set_host(tegra->transceiver, &hcd->self);
}
#endif
return err;
fail_phy:
tegra_usb_phy_close(tegra->phy);
fail_irq:
iounmap(hcd->regs);
fail_clken:
clk_put(tegra->clk);
fail_io:
usb_put_hcd(hcd);
return err;
}
开发者ID:denkem,项目名称:enru-3.1.10-g7f360be,代码行数:101,代码来源:ehci-tegra.c
示例15: keystone_timer_init
static int __init keystone_timer_init(struct device_node *np)
{
struct clock_event_device *event_dev = &timer.event_dev;
unsigned long rate;
struct clk *clk;
int irq, error;
irq = irq_of_parse_and_map(np, 0);
if (!irq) {
pr_err("%s: failed to map interrupts\n", __func__);
return -EINVAL;
}
timer.base = of_iomap(np, 0);
if (!timer.base) {
pr_err("%s: failed to map registers\n", __func__);
return -ENXIO;
}
clk = of_clk_get(np, 0);
if (IS_ERR(clk)) {
pr_err("%s: failed to get clock\n", __func__);
iounmap(timer.base);
return PTR_ERR(clk);
}
error = clk_prepare_enable(clk);
if (error) {
pr_err("%s: failed to enable clock\n", __func__);
goto err;
}
rate = clk_get_rate(clk);
/* disable, use internal clock source */
keystone_timer_writel(0, TCR);
/* here we have to be sure the timer has been disabled */
keystone_timer_barrier();
/* reset timer as 64-bit, no pre-scaler, plus features are disabled */
keystone_timer_writel(0, TGCR);
/* unreset timer */
keystone_timer_writel(TGCR_TIM_UNRESET_MASK, TGCR);
/* init counter to zero */
keystone_timer_writel(0, TIM12);
keystone_timer_writel(0, TIM34);
timer.hz_period = DIV_ROUND_UP(rate, HZ);
/* enable timer interrupts */
keystone_timer_writel(INTCTLSTAT_ENINT_MASK, INTCTLSTAT);
error = request_irq(irq, keystone_timer_interrupt, IRQF_TIMER,
TIMER_NAME, event_dev);
if (error) {
pr_err("%s: failed to setup irq\n", __func__);
goto err;
}
/* setup clockevent */
event_dev->features = CLOCK_EVT_FEAT_PERIODIC | CLOCK_EVT_FEAT_ONESHOT;
event_dev->set_next_event = keystone_set_next_event;
event_dev->set_state_shutdown = keystone_shutdown;
event_dev->set_state_periodic = keystone_set_periodic;
event_dev->set_state_oneshot = keystone_shutdown;
event_dev->cpumask = cpu_possible_mask;
event_dev->owner = THIS_MODULE;
event_dev->name = TIMER_NAME;
event_dev->irq = irq;
clockevents_config_and_register(event_dev, rate, 1, ULONG_MAX);
pr_info("keystone timer clock @%lu Hz\n", rate);
return 0;
err:
clk_put(clk);
iounmap(timer.base);
return error;
}
开发者ID:AlexShiLucky,项目名称:linux,代码行数:81,代码来源:timer-keystone.c
示例16: exynos4_ahci_init
static int exynos4_ahci_init(struct device *dev, void __iomem *mmio)
{
struct clk *clk_sata, *clk_sataphy, *clk_sclk_sata;
int val, ret;
phy_base = ioremap(EXYNOS4_PA_SATAPHY, SZ_64K);
if (!phy_base) {
dev_err(dev, "failed to allocate memory for SATA PHY\n");
return -ENOMEM;
}
phy_ctrl = ioremap(EXYNOS4_PA_SATAPHY_CTRL, SZ_16);
if (!phy_ctrl) {
dev_err(dev, "failed to allocate memory for SATA PHY CTRL\n");
ret = -ENOMEM;
goto err1;
}
clk_sata = clk_get(dev, "sata");
if (IS_ERR(clk_sata)) {
dev_err(dev, "failed to get sata clock\n");
ret = PTR_ERR(clk_sata);
clk_sata = NULL;
goto err2;
}
clk_enable(clk_sata);
clk_sataphy = clk_get(dev, "sataphy");
if (IS_ERR(clk_sataphy)) {
dev_err(dev, "failed to get sataphy clock\n");
ret = PTR_ERR(clk_sataphy);
clk_sataphy = NULL;
goto err3;
}
clk_enable(clk_sataphy);
clk_sclk_sata = clk_get(dev, "sclk_sata");
if (IS_ERR(clk_sclk_sata)) {
dev_err(dev, "failed to get sclk_sata\n");
ret = PTR_ERR(clk_sclk_sata);
clk_sclk_sata = NULL;
goto err4;
}
clk_enable(clk_sclk_sata);
clk_set_rate(clk_sclk_sata, SCLK_SATA_FREQ);
__raw_writel(S5P_PMU_SATA_PHY_CONTROL_EN, S5P_PMU_SATA_PHY_CONTROL);
/* */
val = SATA_CTRL1_RST_PMALIVE_N | SATA_CTRL1_RST_RXOOB_N |
SATA_CTRL1_RST_RX_N | SATA_CTRL1_RST_TX_N;
__raw_writel(val, phy_ctrl + SATA_CTRL1);
/* */
val = SATA_CTRL0_RX_DATA_VALID(3) | SATA_CTRL0_SPEED_MODE |
SATA_CTRL0_PHY_POR_N;
__raw_writel(val, phy_ctrl + SATA_CTRL0);
/* */
__raw_writel(0x1, mmio + HOST_PORTS_IMPL);
return ahci_phy_init(mmio);
err4:
clk_disable(clk_sataphy);
clk_put(clk_sataphy);
err3:
clk_disable(clk_sata);
clk_put(clk_sata);
err2:
iounmap(phy_ctrl);
err1:
iounmap(phy_base);
return ret;
}
开发者ID:curbthepain,项目名称:android_kernel_us990_rev,代码行数:77,代码来源:dev-ahci.c
示例17: s3cmci_probe
//.........这里部分代码省略.........
host->irq_cd = s3c2410_gpio_getirq(host->pdata->gpio_detect);
if (host->irq_cd >= 0) {
if (request_irq(host->irq_cd, s3cmci_irq_cd,
IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING,
DRIVER_NAME, host)) {
dev_err(&pdev->dev, "can't get card detect irq.\n");
ret = -ENOENT;
goto probe_free_irq;
}
} else {
dev_warn(&pdev->dev, "host detect has no irq available\n");
s3c2410_gpio_cfgpin(host->pdata->gpio_detect,
S3C2410_GPIO_INPUT);
}
if (host->pdata->gpio_wprotect)
s3c2410_gpio_cfgpin(host->pdata->gpio_wprotect,
S3C2410_GPIO_INPUT);
if (s3c2410_dma_request(S3CMCI_DMA, &s3cmci_dma_client, NULL) < 0) {
dev_err(&pdev->dev, "unable to get DMA channel.\n");
ret = -EBUSY;
goto probe_free_irq_cd;
}
host->clk = clk_get(&pdev->dev, "sdi");
if (IS_ERR(host->clk)) {
dev_err(&pdev->dev, "failed to find clock source.\n");
ret = PTR_ERR(host->clk);
host->clk = NULL;
goto probe_free_host;
}
ret = clk_enable(host->clk);
if (ret) {
dev_err(&pdev->dev, "failed to enable clock source.\n");
goto clk_free;
}
host->clk_rate = clk_get_rate(host->clk);
mmc->ops = &s3cmci_ops;
mmc->ocr_avail = MMC_VDD_32_33 | MMC_VDD_33_34;
mmc->caps = MMC_CAP_4_BIT_DATA;
mmc->f_min = host->clk_rate / (host->clk_div * 256);
mmc->f_max = host->clk_rate / host->clk_div;
if (host->pdata->ocr_avail)
mmc->ocr_avail = host->pdata->ocr_avail;
mmc->max_blk_count = 4095;
mmc->max_blk_size = 4095;
mmc->max_req_size = 4095 * 512;
mmc->max_seg_size = mmc->max_req_size;
mmc->max_phys_segs = 128;
mmc->max_hw_segs = 128;
dbg(host, dbg_debug,
"probe: mode:%s mapped mci_base:%p irq:%u irq_cd:%u dma:%u.\n",
(host->is2440?"2440":""),
host->base, host->irq, host->irq_cd, host->dma);
ret = mmc_add_host(mmc);
if (ret) {
dev_err(&pdev->dev, "failed to add mmc host.\n");
goto free_dmabuf;
}
platform_set_drvdata(pdev, mmc);
dev_info(&pdev->dev, "initialisation done.\n");
return 0;
free_dmabuf:
clk_disable(host->clk);
clk_free:
clk_put(host->clk);
probe_free_irq_cd:
if (host->irq_cd >= 0)
free_irq(host->irq_cd, host);
probe_free_irq:
free_irq(host->irq, host);
probe_iounmap:
iounmap(host->base);
probe_free_mem_region:
release_mem_region(host->mem->start, RESSIZE(host->mem));
probe_free_host:
mmc_free_host(mmc);
probe_out:
return ret;
}
开发者ID:LouZiffer,项目名称:m900_kernel_cupcake-SDX,代码行数:101,代码来源:s3cmci.c
示例18: msm_iommu_probe
static int msm_iommu_probe(struct platform_device *pdev)
{
struct resource *r, *r2;
struct clk *iommu_clk = NULL;
struct clk *iommu_pclk = NULL;
struct msm_iommu_drvdata *drvdata;
struct msm_iommu_dev *iommu_dev = pdev->dev.platform_data;
void __iomem *regs_base;
resource_size_t len;
int ret, par;
if (pdev->id == -1) {
msm_iommu_root_dev = pdev;
return 0;
}
drvdata = kzalloc(sizeof(*drvdata), GFP_KERNEL);
if (!drvdata) {
ret = -ENOMEM;
goto fail;
}
if (!iommu_dev) {
ret = -ENODEV;
goto fail;
}
iommu_pclk = clk_get_sys("msm_iommu", "iface_clk");
if (IS_ERR(iommu_pclk)) {
ret = -ENODEV;
goto fail;
}
ret = clk_prepare_enable(iommu_pclk);
if (ret)
goto fail_enable;
iommu_clk = clk_get(&pdev->dev, "core_clk");
if (!IS_ERR(iommu_clk)) {
if (clk_get_rate(iommu_clk) == 0) {
ret = clk_round_rate(iommu_clk, 1);
clk_set_rate(iommu_clk, ret);
}
ret = clk_prepare_enable(iommu_clk);
if (ret) {
clk_put(iommu_clk);
goto fail_pclk;
}
} else
iommu_clk = NULL;
r = platform_get_resource_byname(pdev, IORESOURCE_MEM, "physbase");
if (!r) {
ret = -ENODEV;
goto fail_clk;
}
len = resource_size(r);
r2 = request_mem_region(r->start, len, r->name);
if (!r2) {
pr_err("Could not request memory region: start=%p, len=%d\n",
(void *) r->start, len);
ret = -EBUSY;
goto fail_clk;
}
regs_base = ioremap(r2->start, len);
if (!regs_base) {
pr_err("Could not ioremap: start=%p, len=%d\n",
(void *) r2->start, len);
ret = -EBUSY;
goto fail_mem;
}
msm_iommu_reset(regs_base, iommu_dev->ncb);
SET_M(regs_base, 0, 1);
SET_PAR(regs_base, 0, 0);
SET_V2PCFG(regs_base, 0, 1);
SET_V2PPR(regs_base, 0, 0);
mb();
par = GET_PAR(regs_base, 0);
SET_V2PCFG(regs_base, 0, 0);
SET_M(regs_base, 0, 0);
mb();
if (!par) {
pr_err("%s: Invalid PAR value detected\n", iommu_dev->name);
ret = -ENODEV;
goto fail_io;
}
drvdata->pclk = iommu_pclk;
drvdata->clk = iommu_clk;
//.........这里部分代码省略.........
开发者ID:ELWIN-MAO,项目名称:huawei-g330d-u8825d-kernel,代码行数:101,代码来源:iommu_dev.c
示例19: spe |
请发表评论