You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'next/timer' of git://git.linaro.org/people/arnd/arm-soc
* 'next/timer' of git://git.linaro.org/people/arnd/arm-soc: clocksource: fixup ux500 build problems ARM: omap: use __devexit_p in dmtimer driver ARM: ux500: Reprogram timers upon resume ARM: plat-nomadik: timer: Export reset functions ARM: plat-nomadik: timer: Add support for periodic timers ARM: ux500: Move timer code to separate file ARM: ux500: add support for clocksource DBX500 PRCMU clocksource: add DBX500 PRCMU Timer support ARM: plat-nomadik: MTU sched_clock as an option ARM: OMAP: dmtimer: add error handling to export APIs ARM: OMAP: dmtimer: low-power mode support ARM: OMAP: dmtimer: skip reserved timers ARM: OMAP: dmtimer: pm_runtime support ARM: OMAP: dmtimer: switch-over to platform device driver ARM: OMAP: dmtimer: platform driver ARM: OMAP2+: dmtimer: convert to platform devices ARM: OMAP1: dmtimer: conversion to platform devices ARM: OMAP2+: dmtimer: add device names to flck nodes ARM: OMAP: Add support for dmtimer v2 ip
This commit is contained in:
@@ -4,7 +4,7 @@
|
||||
|
||||
# Common support
|
||||
obj-y := io.o id.o sram.o time.o irq.o mux.o flash.o serial.o devices.o dma.o
|
||||
obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o
|
||||
obj-y += clock.o clock_data.o opp_data.o reset.o pm_bus.o timer.o
|
||||
|
||||
obj-$(CONFIG_OMAP_MCBSP) += mcbsp.o
|
||||
|
||||
|
||||
@@ -0,0 +1,173 @@
|
||||
/**
|
||||
* OMAP1 Dual-Mode Timers - platform device registration
|
||||
*
|
||||
* Contains first level initialization routines which internally
|
||||
* generates timer device information and registers with linux
|
||||
* device model. It also has low level function to chnage the timer
|
||||
* input clock source.
|
||||
*
|
||||
* Copyright (C) 2011 Texas Instruments Incorporated - http://www.ti.com/
|
||||
* Tarun Kanti DebBarma <tarun.kanti@ti.com>
|
||||
* Thara Gopinath <thara@ti.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed "as is" WITHOUT ANY WARRANTY of any
|
||||
* kind, whether express or implied; without even the implied warranty
|
||||
* of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*/
|
||||
|
||||
#include <linux/clk.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <mach/irqs.h>
|
||||
|
||||
#include <plat/dmtimer.h>
|
||||
|
||||
#define OMAP1610_GPTIMER1_BASE 0xfffb1400
|
||||
#define OMAP1610_GPTIMER2_BASE 0xfffb1c00
|
||||
#define OMAP1610_GPTIMER3_BASE 0xfffb2400
|
||||
#define OMAP1610_GPTIMER4_BASE 0xfffb2c00
|
||||
#define OMAP1610_GPTIMER5_BASE 0xfffb3400
|
||||
#define OMAP1610_GPTIMER6_BASE 0xfffb3c00
|
||||
#define OMAP1610_GPTIMER7_BASE 0xfffb7400
|
||||
#define OMAP1610_GPTIMER8_BASE 0xfffbd400
|
||||
|
||||
#define OMAP1_DM_TIMER_COUNT 8
|
||||
|
||||
static int omap1_dm_timer_set_src(struct platform_device *pdev,
|
||||
int source)
|
||||
{
|
||||
int n = (pdev->id - 1) << 1;
|
||||
u32 l;
|
||||
|
||||
l = __raw_readl(MOD_CONF_CTRL_1) & ~(0x03 << n);
|
||||
l |= source << n;
|
||||
__raw_writel(l, MOD_CONF_CTRL_1);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int __init omap1_dm_timer_init(void)
|
||||
{
|
||||
int i;
|
||||
int ret;
|
||||
struct dmtimer_platform_data *pdata;
|
||||
struct platform_device *pdev;
|
||||
|
||||
if (!cpu_is_omap16xx())
|
||||
return 0;
|
||||
|
||||
for (i = 1; i <= OMAP1_DM_TIMER_COUNT; i++) {
|
||||
struct resource res[2];
|
||||
u32 base, irq;
|
||||
|
||||
switch (i) {
|
||||
case 1:
|
||||
base = OMAP1610_GPTIMER1_BASE;
|
||||
irq = INT_1610_GPTIMER1;
|
||||
break;
|
||||
case 2:
|
||||
base = OMAP1610_GPTIMER2_BASE;
|
||||
irq = INT_1610_GPTIMER2;
|
||||
break;
|
||||
case 3:
|
||||
base = OMAP1610_GPTIMER3_BASE;
|
||||
irq = INT_1610_GPTIMER3;
|
||||
break;
|
||||
case 4:
|
||||
base = OMAP1610_GPTIMER4_BASE;
|
||||
irq = INT_1610_GPTIMER4;
|
||||
break;
|
||||
case 5:
|
||||
base = OMAP1610_GPTIMER5_BASE;
|
||||
irq = INT_1610_GPTIMER5;
|
||||
break;
|
||||
case 6:
|
||||
base = OMAP1610_GPTIMER6_BASE;
|
||||
irq = INT_1610_GPTIMER6;
|
||||
break;
|
||||
case 7:
|
||||
base = OMAP1610_GPTIMER7_BASE;
|
||||
irq = INT_1610_GPTIMER7;
|
||||
break;
|
||||
case 8:
|
||||
base = OMAP1610_GPTIMER8_BASE;
|
||||
irq = INT_1610_GPTIMER8;
|
||||
break;
|
||||
default:
|
||||
/*
|
||||
* not supposed to reach here.
|
||||
* this is to remove warning.
|
||||
*/
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
pdev = platform_device_alloc("omap_timer", i);
|
||||
if (!pdev) {
|
||||
pr_err("%s: Failed to device alloc for dmtimer%d\n",
|
||||
__func__, i);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
memset(res, 0, 2 * sizeof(struct resource));
|
||||
res[0].start = base;
|
||||
res[0].end = base + 0x46;
|
||||
res[0].flags = IORESOURCE_MEM;
|
||||
res[1].start = irq;
|
||||
res[1].end = irq;
|
||||
res[1].flags = IORESOURCE_IRQ;
|
||||
ret = platform_device_add_resources(pdev, res,
|
||||
ARRAY_SIZE(res));
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "%s: Failed to add resources.\n",
|
||||
__func__);
|
||||
goto err_free_pdev;
|
||||
}
|
||||
|
||||
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
dev_err(&pdev->dev, "%s: Failed to allocate pdata.\n",
|
||||
__func__);
|
||||
ret = -ENOMEM;
|
||||
goto err_free_pdata;
|
||||
}
|
||||
|
||||
pdata->set_timer_src = omap1_dm_timer_set_src;
|
||||
pdata->needs_manual_reset = 1;
|
||||
|
||||
ret = platform_device_add_data(pdev, pdata, sizeof(*pdata));
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "%s: Failed to add platform data.\n",
|
||||
__func__);
|
||||
goto err_free_pdata;
|
||||
}
|
||||
|
||||
ret = platform_device_add(pdev);
|
||||
if (ret) {
|
||||
dev_err(&pdev->dev, "%s: Failed to add platform device.\n",
|
||||
__func__);
|
||||
goto err_free_pdata;
|
||||
}
|
||||
|
||||
dev_dbg(&pdev->dev, " Registered.\n");
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_free_pdata:
|
||||
kfree(pdata);
|
||||
|
||||
err_free_pdev:
|
||||
platform_device_unregister(pdev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
arch_initcall(omap1_dm_timer_init);
|
||||
@@ -1898,6 +1898,54 @@ static struct omap_clk omap2420_clks[] = {
|
||||
CLK(NULL, "pka_ick", &pka_ick, CK_242X),
|
||||
CLK(NULL, "usb_fck", &usb_fck, CK_242X),
|
||||
CLK("musb-hdrc", "fck", &osc_ck, CK_242X),
|
||||
CLK("omap_timer.1", "fck", &gpt1_fck, CK_242X),
|
||||
CLK("omap_timer.2", "fck", &gpt2_fck, CK_242X),
|
||||
CLK("omap_timer.3", "fck", &gpt3_fck, CK_242X),
|
||||
CLK("omap_timer.4", "fck", &gpt4_fck, CK_242X),
|
||||
CLK("omap_timer.5", "fck", &gpt5_fck, CK_242X),
|
||||
CLK("omap_timer.6", "fck", &gpt6_fck, CK_242X),
|
||||
CLK("omap_timer.7", "fck", &gpt7_fck, CK_242X),
|
||||
CLK("omap_timer.8", "fck", &gpt8_fck, CK_242X),
|
||||
CLK("omap_timer.9", "fck", &gpt9_fck, CK_242X),
|
||||
CLK("omap_timer.10", "fck", &gpt10_fck, CK_242X),
|
||||
CLK("omap_timer.11", "fck", &gpt11_fck, CK_242X),
|
||||
CLK("omap_timer.12", "fck", &gpt12_fck, CK_242X),
|
||||
CLK("omap_timer.1", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.2", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.3", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.4", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.5", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.6", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.7", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.8", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.9", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.10", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.11", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.12", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.1", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.2", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.3", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.4", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.5", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.6", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.7", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.8", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.9", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.10", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.11", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.12", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.1", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.2", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.3", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.4", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.5", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.6", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.7", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.8", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.9", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.10", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.11", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.12", "alt_ck", &alt_ck, CK_243X),
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -1998,6 +1998,54 @@ static struct omap_clk omap2430_clks[] = {
|
||||
CLK(NULL, "mdm_intc_ick", &mdm_intc_ick, CK_243X),
|
||||
CLK("omap_hsmmc.0", "mmchsdb_fck", &mmchsdb1_fck, CK_243X),
|
||||
CLK("omap_hsmmc.1", "mmchsdb_fck", &mmchsdb2_fck, CK_243X),
|
||||
CLK("omap_timer.1", "fck", &gpt1_fck, CK_243X),
|
||||
CLK("omap_timer.2", "fck", &gpt2_fck, CK_243X),
|
||||
CLK("omap_timer.3", "fck", &gpt3_fck, CK_243X),
|
||||
CLK("omap_timer.4", "fck", &gpt4_fck, CK_243X),
|
||||
CLK("omap_timer.5", "fck", &gpt5_fck, CK_243X),
|
||||
CLK("omap_timer.6", "fck", &gpt6_fck, CK_243X),
|
||||
CLK("omap_timer.7", "fck", &gpt7_fck, CK_243X),
|
||||
CLK("omap_timer.8", "fck", &gpt8_fck, CK_243X),
|
||||
CLK("omap_timer.9", "fck", &gpt9_fck, CK_243X),
|
||||
CLK("omap_timer.10", "fck", &gpt10_fck, CK_243X),
|
||||
CLK("omap_timer.11", "fck", &gpt11_fck, CK_243X),
|
||||
CLK("omap_timer.12", "fck", &gpt12_fck, CK_243X),
|
||||
CLK("omap_timer.1", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.2", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.3", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.4", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.5", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.6", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.7", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.8", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.9", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.10", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.11", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.12", "32k_ck", &func_32k_ck, CK_243X),
|
||||
CLK("omap_timer.1", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.2", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.3", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.4", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.5", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.6", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.7", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.8", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.9", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.10", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.11", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.12", "sys_ck", &sys_ck, CK_243X),
|
||||
CLK("omap_timer.1", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.2", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.3", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.4", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.5", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.6", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.7", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.8", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.9", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.10", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.11", "alt_ck", &alt_ck, CK_243X),
|
||||
CLK("omap_timer.12", "alt_ck", &alt_ck, CK_243X),
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -3464,6 +3464,42 @@ static struct omap_clk omap3xxx_clks[] = {
|
||||
CLK("musb-am35x", "fck", &hsotgusb_fck_am35xx, CK_AM35XX),
|
||||
CLK(NULL, "hecc_ck", &hecc_ck, CK_AM35XX),
|
||||
CLK(NULL, "uart4_ick", &uart4_ick_am35xx, CK_AM35XX),
|
||||
CLK("omap_timer.1", "fck", &gpt1_fck, CK_3XXX),
|
||||
CLK("omap_timer.2", "fck", &gpt2_fck, CK_3XXX),
|
||||
CLK("omap_timer.3", "fck", &gpt3_fck, CK_3XXX),
|
||||
CLK("omap_timer.4", "fck", &gpt4_fck, CK_3XXX),
|
||||
CLK("omap_timer.5", "fck", &gpt5_fck, CK_3XXX),
|
||||
CLK("omap_timer.6", "fck", &gpt6_fck, CK_3XXX),
|
||||
CLK("omap_timer.7", "fck", &gpt7_fck, CK_3XXX),
|
||||
CLK("omap_timer.8", "fck", &gpt8_fck, CK_3XXX),
|
||||
CLK("omap_timer.9", "fck", &gpt9_fck, CK_3XXX),
|
||||
CLK("omap_timer.10", "fck", &gpt10_fck, CK_3XXX),
|
||||
CLK("omap_timer.11", "fck", &gpt11_fck, CK_3XXX),
|
||||
CLK("omap_timer.12", "fck", &gpt12_fck, CK_3XXX),
|
||||
CLK("omap_timer.1", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.2", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.3", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.4", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.5", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.6", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.7", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.8", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.9", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.10", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.11", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.12", "32k_ck", &omap_32k_fck, CK_3XXX),
|
||||
CLK("omap_timer.1", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.2", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.3", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.4", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.5", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.6", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.7", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.8", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.9", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.10", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.11", "sys_ck", &sys_ck, CK_3XXX),
|
||||
CLK("omap_timer.12", "sys_ck", &sys_ck, CK_3XXX),
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -3363,6 +3363,39 @@ static struct omap_clk omap44xx_clks[] = {
|
||||
CLK("usbhs-omap.0", "usbhost_ick", &dummy_ck, CK_443X),
|
||||
CLK("usbhs-omap.0", "usbtll_fck", &dummy_ck, CK_443X),
|
||||
CLK("omap_wdt", "ick", &dummy_ck, CK_443X),
|
||||
CLK("omap_timer.1", "fck", &timer1_fck, CK_443X),
|
||||
CLK("omap_timer.2", "fck", &timer2_fck, CK_443X),
|
||||
CLK("omap_timer.3", "fck", &timer3_fck, CK_443X),
|
||||
CLK("omap_timer.4", "fck", &timer4_fck, CK_443X),
|
||||
CLK("omap_timer.5", "fck", &timer5_fck, CK_443X),
|
||||
CLK("omap_timer.6", "fck", &timer6_fck, CK_443X),
|
||||
CLK("omap_timer.7", "fck", &timer7_fck, CK_443X),
|
||||
CLK("omap_timer.8", "fck", &timer8_fck, CK_443X),
|
||||
CLK("omap_timer.9", "fck", &timer9_fck, CK_443X),
|
||||
CLK("omap_timer.10", "fck", &timer10_fck, CK_443X),
|
||||
CLK("omap_timer.11", "fck", &timer11_fck, CK_443X),
|
||||
CLK("omap_timer.1", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.2", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.3", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.4", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.5", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.6", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.7", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.8", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.9", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.10", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.11", "32k_ck", &sys_32k_ck, CK_443X),
|
||||
CLK("omap_timer.1", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.2", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.3", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.4", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.9", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.10", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.11", "sys_ck", &sys_clkin_ck, CK_443X),
|
||||
CLK("omap_timer.5", "sys_ck", &syc_clk_div_ck, CK_443X),
|
||||
CLK("omap_timer.6", "sys_ck", &syc_clk_div_ck, CK_443X),
|
||||
CLK("omap_timer.7", "sys_ck", &syc_clk_div_ck, CK_443X),
|
||||
CLK("omap_timer.8", "sys_ck", &syc_clk_div_ck, CK_443X),
|
||||
};
|
||||
|
||||
int __init omap4xxx_clk_init(void)
|
||||
|
||||
@@ -269,6 +269,16 @@ static struct omap_hwmod omap2420_iva_hwmod = {
|
||||
.masters_cnt = ARRAY_SIZE(omap2420_iva_masters),
|
||||
};
|
||||
|
||||
/* always-on timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_ALWON,
|
||||
};
|
||||
|
||||
/* pwm timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_HAS_PWM,
|
||||
};
|
||||
|
||||
/* timer1 */
|
||||
static struct omap_hwmod omap2420_timer1_hwmod;
|
||||
|
||||
@@ -309,6 +319,7 @@ static struct omap_hwmod omap2420_timer1_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer1_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -345,6 +356,7 @@ static struct omap_hwmod omap2420_timer2_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer2_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -381,6 +393,7 @@ static struct omap_hwmod omap2420_timer3_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer3_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -417,6 +430,7 @@ static struct omap_hwmod omap2420_timer4_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer4_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer4_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -453,6 +467,7 @@ static struct omap_hwmod omap2420_timer5_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer5_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer5_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -490,6 +505,7 @@ static struct omap_hwmod omap2420_timer6_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer6_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer6_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -526,6 +542,7 @@ static struct omap_hwmod omap2420_timer7_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer7_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer7_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -562,6 +579,7 @@ static struct omap_hwmod omap2420_timer8_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2420_timer8_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer8_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -598,6 +616,7 @@ static struct omap_hwmod omap2420_timer9_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2420_timer9_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer9_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -634,6 +653,7 @@ static struct omap_hwmod omap2420_timer10_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2420_timer10_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer10_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -670,6 +690,7 @@ static struct omap_hwmod omap2420_timer11_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2420_timer11_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer11_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -706,6 +727,7 @@ static struct omap_hwmod omap2420_timer12_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2420_timer12_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2420_timer12_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
|
||||
@@ -343,6 +343,16 @@ static struct omap_hwmod omap2430_iva_hwmod = {
|
||||
.masters_cnt = ARRAY_SIZE(omap2430_iva_masters),
|
||||
};
|
||||
|
||||
/* always-on timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_ALWON,
|
||||
};
|
||||
|
||||
/* pwm timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_HAS_PWM,
|
||||
};
|
||||
|
||||
/* timer1 */
|
||||
static struct omap_hwmod omap2430_timer1_hwmod;
|
||||
|
||||
@@ -383,6 +393,7 @@ static struct omap_hwmod omap2430_timer1_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT1_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer1_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -419,6 +430,7 @@ static struct omap_hwmod omap2430_timer2_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT2_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer2_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -455,6 +467,7 @@ static struct omap_hwmod omap2430_timer3_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT3_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer3_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -491,6 +504,7 @@ static struct omap_hwmod omap2430_timer4_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT4_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer4_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer4_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -527,6 +541,7 @@ static struct omap_hwmod omap2430_timer5_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT5_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer5_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer5_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -563,6 +578,7 @@ static struct omap_hwmod omap2430_timer6_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT6_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer6_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer6_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -599,6 +615,7 @@ static struct omap_hwmod omap2430_timer7_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT7_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer7_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer7_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -635,6 +652,7 @@ static struct omap_hwmod omap2430_timer8_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT8_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap2430_timer8_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer8_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -671,6 +689,7 @@ static struct omap_hwmod omap2430_timer9_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT9_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2430_timer9_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer9_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -707,6 +726,7 @@ static struct omap_hwmod omap2430_timer10_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT10_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2430_timer10_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer10_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -743,6 +763,7 @@ static struct omap_hwmod omap2430_timer11_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT11_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2430_timer11_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer11_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
@@ -779,6 +800,7 @@ static struct omap_hwmod omap2430_timer12_hwmod = {
|
||||
.idlest_idle_bit = OMAP24XX_ST_GPT12_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap2430_timer12_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap2430_timer12_slaves),
|
||||
.class = &omap2xxx_timer_hwmod_class,
|
||||
|
||||
@@ -564,6 +564,21 @@ static struct omap_hwmod_class omap3xxx_timer_hwmod_class = {
|
||||
.rev = OMAP_TIMER_IP_VERSION_1,
|
||||
};
|
||||
|
||||
/* secure timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_secure_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_SECURE,
|
||||
};
|
||||
|
||||
/* always-on timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_ALWON,
|
||||
};
|
||||
|
||||
/* pwm timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_HAS_PWM,
|
||||
};
|
||||
|
||||
/* timer1 */
|
||||
static struct omap_hwmod omap3xxx_timer1_hwmod;
|
||||
|
||||
@@ -604,6 +619,7 @@ static struct omap_hwmod omap3xxx_timer1_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT1_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer1_slaves),
|
||||
.class = &omap3xxx_timer_1ms_hwmod_class,
|
||||
@@ -649,6 +665,7 @@ static struct omap_hwmod omap3xxx_timer2_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT2_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer2_slaves),
|
||||
.class = &omap3xxx_timer_1ms_hwmod_class,
|
||||
@@ -694,6 +711,7 @@ static struct omap_hwmod omap3xxx_timer3_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT3_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer3_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -739,6 +757,7 @@ static struct omap_hwmod omap3xxx_timer4_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT4_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer4_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer4_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -784,6 +803,7 @@ static struct omap_hwmod omap3xxx_timer5_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT5_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer5_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer5_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -829,6 +849,7 @@ static struct omap_hwmod omap3xxx_timer6_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT6_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer6_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer6_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -874,6 +895,7 @@ static struct omap_hwmod omap3xxx_timer7_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT7_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap3xxx_timer7_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer7_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -919,6 +941,7 @@ static struct omap_hwmod omap3xxx_timer8_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT8_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap3xxx_timer8_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer8_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -964,6 +987,7 @@ static struct omap_hwmod omap3xxx_timer9_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT9_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap3xxx_timer9_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer9_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -1000,6 +1024,7 @@ static struct omap_hwmod omap3xxx_timer10_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT10_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap3xxx_timer10_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer10_slaves),
|
||||
.class = &omap3xxx_timer_1ms_hwmod_class,
|
||||
@@ -1036,6 +1061,7 @@ static struct omap_hwmod omap3xxx_timer11_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT11_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap3xxx_timer11_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer11_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
@@ -1085,6 +1111,7 @@ static struct omap_hwmod omap3xxx_timer12_hwmod = {
|
||||
.idlest_idle_bit = OMAP3430_ST_GPT12_SHIFT,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_secure_dev_attr,
|
||||
.slaves = omap3xxx_timer12_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap3xxx_timer12_slaves),
|
||||
.class = &omap3xxx_timer_hwmod_class,
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
#include <plat/mcbsp.h>
|
||||
#include <plat/mmc.h>
|
||||
#include <plat/i2c.h>
|
||||
#include <plat/dmtimer.h>
|
||||
|
||||
#include "omap_hwmod_common_data.h"
|
||||
|
||||
@@ -4201,6 +4202,16 @@ static struct omap_hwmod_class omap44xx_timer_hwmod_class = {
|
||||
.sysc = &omap44xx_timer_sysc,
|
||||
};
|
||||
|
||||
/* always-on timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_alwon_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_ALWON,
|
||||
};
|
||||
|
||||
/* pwm timers dev attribute */
|
||||
static struct omap_timer_capability_dev_attr capability_pwm_dev_attr = {
|
||||
.timer_capability = OMAP_TIMER_HAS_PWM,
|
||||
};
|
||||
|
||||
/* timer1 */
|
||||
static struct omap_hwmod omap44xx_timer1_hwmod;
|
||||
static struct omap_hwmod_irq_info omap44xx_timer1_irqs[] = {
|
||||
@@ -4244,6 +4255,7 @@ static struct omap_hwmod omap44xx_timer1_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer1_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer1_slaves),
|
||||
};
|
||||
@@ -4291,6 +4303,7 @@ static struct omap_hwmod omap44xx_timer2_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer2_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer2_slaves),
|
||||
};
|
||||
@@ -4338,6 +4351,7 @@ static struct omap_hwmod omap44xx_timer3_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer3_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer3_slaves),
|
||||
};
|
||||
@@ -4385,6 +4399,7 @@ static struct omap_hwmod omap44xx_timer4_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer4_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer4_slaves),
|
||||
};
|
||||
@@ -4451,6 +4466,7 @@ static struct omap_hwmod omap44xx_timer5_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer5_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer5_slaves),
|
||||
};
|
||||
@@ -4518,6 +4534,7 @@ static struct omap_hwmod omap44xx_timer6_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer6_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer6_slaves),
|
||||
};
|
||||
@@ -4584,6 +4601,7 @@ static struct omap_hwmod omap44xx_timer7_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_alwon_dev_attr,
|
||||
.slaves = omap44xx_timer7_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer7_slaves),
|
||||
};
|
||||
@@ -4650,6 +4668,7 @@ static struct omap_hwmod omap44xx_timer8_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap44xx_timer8_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer8_slaves),
|
||||
};
|
||||
@@ -4697,6 +4716,7 @@ static struct omap_hwmod omap44xx_timer9_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap44xx_timer9_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer9_slaves),
|
||||
};
|
||||
@@ -4744,6 +4764,7 @@ static struct omap_hwmod omap44xx_timer10_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap44xx_timer10_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer10_slaves),
|
||||
};
|
||||
@@ -4791,6 +4812,7 @@ static struct omap_hwmod omap44xx_timer11_hwmod = {
|
||||
.modulemode = MODULEMODE_SWCTRL,
|
||||
},
|
||||
},
|
||||
.dev_attr = &capability_pwm_dev_attr,
|
||||
.slaves = omap44xx_timer11_slaves,
|
||||
.slaves_cnt = ARRAY_SIZE(omap44xx_timer11_slaves),
|
||||
};
|
||||
|
||||
+182
-12
@@ -35,6 +35,7 @@
|
||||
#include <linux/irq.h>
|
||||
#include <linux/clocksource.h>
|
||||
#include <linux/clockchips.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/mach/time.h>
|
||||
#include <plat/dmtimer.h>
|
||||
@@ -42,6 +43,10 @@
|
||||
#include <asm/sched_clock.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/omap_hwmod.h>
|
||||
#include <plat/omap_device.h>
|
||||
#include <plat/omap-pm.h>
|
||||
|
||||
#include "powerdomain.h"
|
||||
|
||||
/* Parent clocks, eventually these will come from the clock framework */
|
||||
|
||||
@@ -67,7 +72,7 @@
|
||||
/* MAX_GPTIMER_ID: number of GPTIMERs on the chip */
|
||||
#define MAX_GPTIMER_ID 12
|
||||
|
||||
u32 sys_timer_reserved;
|
||||
static u32 sys_timer_reserved;
|
||||
|
||||
/* Clockevent code */
|
||||
|
||||
@@ -78,7 +83,7 @@ static irqreturn_t omap2_gp_timer_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct clock_event_device *evt = &clockevent_gpt;
|
||||
|
||||
__omap_dm_timer_write_status(clkev.io_base, OMAP_TIMER_INT_OVERFLOW);
|
||||
__omap_dm_timer_write_status(&clkev, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
evt->event_handler(evt);
|
||||
return IRQ_HANDLED;
|
||||
@@ -93,7 +98,7 @@ static struct irqaction omap2_gp_timer_irq = {
|
||||
static int omap2_gp_timer_set_next_event(unsigned long cycles,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
__omap_dm_timer_load_start(clkev.io_base, OMAP_TIMER_CTRL_ST,
|
||||
__omap_dm_timer_load_start(&clkev, OMAP_TIMER_CTRL_ST,
|
||||
0xffffffff - cycles, 1);
|
||||
|
||||
return 0;
|
||||
@@ -104,16 +109,16 @@ static void omap2_gp_timer_set_mode(enum clock_event_mode mode,
|
||||
{
|
||||
u32 period;
|
||||
|
||||
__omap_dm_timer_stop(clkev.io_base, 1, clkev.rate);
|
||||
__omap_dm_timer_stop(&clkev, 1, clkev.rate);
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
period = clkev.rate / HZ;
|
||||
period -= 1;
|
||||
/* Looks like we need to first set the load value separately */
|
||||
__omap_dm_timer_write(clkev.io_base, OMAP_TIMER_LOAD_REG,
|
||||
__omap_dm_timer_write(&clkev, OMAP_TIMER_LOAD_REG,
|
||||
0xffffffff - period, 1);
|
||||
__omap_dm_timer_load_start(clkev.io_base,
|
||||
__omap_dm_timer_load_start(&clkev,
|
||||
OMAP_TIMER_CTRL_AR | OMAP_TIMER_CTRL_ST,
|
||||
0xffffffff - period, 1);
|
||||
break;
|
||||
@@ -189,7 +194,8 @@ static int __init omap_dm_timer_init_one(struct omap_dm_timer *timer,
|
||||
clk_put(src);
|
||||
}
|
||||
}
|
||||
__omap_dm_timer_reset(timer->io_base, 1, 1);
|
||||
__omap_dm_timer_init_regs(timer);
|
||||
__omap_dm_timer_reset(timer, 1, 1);
|
||||
timer->posted = 1;
|
||||
|
||||
timer->rate = clk_get_rate(timer->fclk);
|
||||
@@ -210,7 +216,7 @@ static void __init omap2_gp_clockevent_init(int gptimer_id,
|
||||
omap2_gp_timer_irq.dev_id = (void *)&clkev;
|
||||
setup_irq(clkev.irq, &omap2_gp_timer_irq);
|
||||
|
||||
__omap_dm_timer_int_enable(clkev.io_base, OMAP_TIMER_INT_OVERFLOW);
|
||||
__omap_dm_timer_int_enable(&clkev, OMAP_TIMER_INT_OVERFLOW);
|
||||
|
||||
clockevent_gpt.mult = div_sc(clkev.rate, NSEC_PER_SEC,
|
||||
clockevent_gpt.shift);
|
||||
@@ -251,7 +257,7 @@ static struct omap_dm_timer clksrc;
|
||||
static DEFINE_CLOCK_DATA(cd);
|
||||
static cycle_t clocksource_read_cycles(struct clocksource *cs)
|
||||
{
|
||||
return (cycle_t)__omap_dm_timer_read_counter(clksrc.io_base, 1);
|
||||
return (cycle_t)__omap_dm_timer_read_counter(&clksrc, 1);
|
||||
}
|
||||
|
||||
static struct clocksource clocksource_gpt = {
|
||||
@@ -266,7 +272,7 @@ static void notrace dmtimer_update_sched_clock(void)
|
||||
{
|
||||
u32 cyc;
|
||||
|
||||
cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
|
||||
cyc = __omap_dm_timer_read_counter(&clksrc, 1);
|
||||
|
||||
update_sched_clock(&cd, cyc, (u32)~0);
|
||||
}
|
||||
@@ -276,7 +282,7 @@ unsigned long long notrace sched_clock(void)
|
||||
u32 cyc = 0;
|
||||
|
||||
if (clksrc.reserved)
|
||||
cyc = __omap_dm_timer_read_counter(clksrc.io_base, 1);
|
||||
cyc = __omap_dm_timer_read_counter(&clksrc, 1);
|
||||
|
||||
return cyc_to_sched_clock(&cd, cyc, (u32)~0);
|
||||
}
|
||||
@@ -293,7 +299,7 @@ static void __init omap2_gp_clocksource_init(int gptimer_id,
|
||||
pr_info("OMAP clocksource: GPTIMER%d at %lu Hz\n",
|
||||
gptimer_id, clksrc.rate);
|
||||
|
||||
__omap_dm_timer_load_start(clksrc.io_base,
|
||||
__omap_dm_timer_load_start(&clksrc,
|
||||
OMAP_TIMER_CTRL_ST | OMAP_TIMER_CTRL_AR, 0, 1);
|
||||
init_sched_clock(&cd, dmtimer_update_sched_clock, 32, clksrc.rate);
|
||||
|
||||
@@ -341,3 +347,167 @@ static void __init omap4_timer_init(void)
|
||||
}
|
||||
OMAP_SYS_TIMER(4)
|
||||
#endif
|
||||
|
||||
/**
|
||||
* omap2_dm_timer_set_src - change the timer input clock source
|
||||
* @pdev: timer platform device pointer
|
||||
* @source: array index of parent clock source
|
||||
*/
|
||||
static int omap2_dm_timer_set_src(struct platform_device *pdev, int source)
|
||||
{
|
||||
int ret;
|
||||
struct dmtimer_platform_data *pdata = pdev->dev.platform_data;
|
||||
struct clk *fclk, *parent;
|
||||
char *parent_name = NULL;
|
||||
|
||||
fclk = clk_get(&pdev->dev, "fck");
|
||||
if (IS_ERR_OR_NULL(fclk)) {
|
||||
dev_err(&pdev->dev, "%s: %d: clk_get() FAILED\n",
|
||||
__func__, __LINE__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
switch (source) {
|
||||
case OMAP_TIMER_SRC_SYS_CLK:
|
||||
parent_name = "sys_ck";
|
||||
break;
|
||||
|
||||
case OMAP_TIMER_SRC_32_KHZ:
|
||||
parent_name = "32k_ck";
|
||||
break;
|
||||
|
||||
case OMAP_TIMER_SRC_EXT_CLK:
|
||||
if (pdata->timer_ip_version == OMAP_TIMER_IP_VERSION_1) {
|
||||
parent_name = "alt_ck";
|
||||
break;
|
||||
}
|
||||
dev_err(&pdev->dev, "%s: %d: invalid clk src.\n",
|
||||
__func__, __LINE__);
|
||||
clk_put(fclk);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
parent = clk_get(&pdev->dev, parent_name);
|
||||
if (IS_ERR_OR_NULL(parent)) {
|
||||
dev_err(&pdev->dev, "%s: %d: clk_get() %s FAILED\n",
|
||||
__func__, __LINE__, parent_name);
|
||||
clk_put(fclk);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
ret = clk_set_parent(fclk, parent);
|
||||
if (IS_ERR_VALUE(ret)) {
|
||||
dev_err(&pdev->dev, "%s: clk_set_parent() to %s FAILED\n",
|
||||
__func__, parent_name);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
clk_put(parent);
|
||||
clk_put(fclk);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
struct omap_device_pm_latency omap2_dmtimer_latency[] = {
|
||||
{
|
||||
.deactivate_func = omap_device_idle_hwmods,
|
||||
.activate_func = omap_device_enable_hwmods,
|
||||
.flags = OMAP_DEVICE_LATENCY_AUTO_ADJUST,
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* omap_timer_init - build and register timer device with an
|
||||
* associated timer hwmod
|
||||
* @oh: timer hwmod pointer to be used to build timer device
|
||||
* @user: parameter that can be passed from calling hwmod API
|
||||
*
|
||||
* Called by omap_hwmod_for_each_by_class to register each of the timer
|
||||
* devices present in the system. The number of timer devices is known
|
||||
* by parsing through the hwmod database for a given class name. At the
|
||||
* end of function call memory is allocated for timer device and it is
|
||||
* registered to the framework ready to be proved by the driver.
|
||||
*/
|
||||
static int __init omap_timer_init(struct omap_hwmod *oh, void *unused)
|
||||
{
|
||||
int id;
|
||||
int ret = 0;
|
||||
char *name = "omap_timer";
|
||||
struct dmtimer_platform_data *pdata;
|
||||
struct omap_device *od;
|
||||
struct omap_timer_capability_dev_attr *timer_dev_attr;
|
||||
struct powerdomain *pwrdm;
|
||||
|
||||
pr_debug("%s: %s\n", __func__, oh->name);
|
||||
|
||||
/* on secure device, do not register secure timer */
|
||||
timer_dev_attr = oh->dev_attr;
|
||||
if (omap_type() != OMAP2_DEVICE_TYPE_GP && timer_dev_attr)
|
||||
if (timer_dev_attr->timer_capability == OMAP_TIMER_SECURE)
|
||||
return ret;
|
||||
|
||||
pdata = kzalloc(sizeof(*pdata), GFP_KERNEL);
|
||||
if (!pdata) {
|
||||
pr_err("%s: No memory for [%s]\n", __func__, oh->name);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
/*
|
||||
* Extract the IDs from name field in hwmod database
|
||||
* and use the same for constructing ids' for the
|
||||
* timer devices. In a way, we are avoiding usage of
|
||||
* static variable witin the function to do the same.
|
||||
* CAUTION: We have to be careful and make sure the
|
||||
* name in hwmod database does not change in which case
|
||||
* we might either make corresponding change here or
|
||||
* switch back static variable mechanism.
|
||||
*/
|
||||
sscanf(oh->name, "timer%2d", &id);
|
||||
|
||||
pdata->set_timer_src = omap2_dm_timer_set_src;
|
||||
pdata->timer_ip_version = oh->class->rev;
|
||||
|
||||
/* Mark clocksource and clockevent timers as reserved */
|
||||
if ((sys_timer_reserved >> (id - 1)) & 0x1)
|
||||
pdata->reserved = 1;
|
||||
|
||||
pwrdm = omap_hwmod_get_pwrdm(oh);
|
||||
pdata->loses_context = pwrdm_can_ever_lose_context(pwrdm);
|
||||
#ifdef CONFIG_PM
|
||||
pdata->get_context_loss_count = omap_pm_get_dev_context_loss_count;
|
||||
#endif
|
||||
od = omap_device_build(name, id, oh, pdata, sizeof(*pdata),
|
||||
omap2_dmtimer_latency,
|
||||
ARRAY_SIZE(omap2_dmtimer_latency),
|
||||
0);
|
||||
|
||||
if (IS_ERR(od)) {
|
||||
pr_err("%s: Can't build omap_device for %s: %s.\n",
|
||||
__func__, name, oh->name);
|
||||
ret = -EINVAL;
|
||||
}
|
||||
|
||||
kfree(pdata);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* omap2_dm_timer_init - top level regular device initialization
|
||||
*
|
||||
* Uses dedicated hwmod api to parse through hwmod database for
|
||||
* given class name and then build and register the timer device.
|
||||
*/
|
||||
static int __init omap2_dm_timer_init(void)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = omap_hwmod_for_each_by_class("timer", omap_timer_init, NULL);
|
||||
if (unlikely(ret)) {
|
||||
pr_err("%s: device registration failed.\n", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
arch_initcall(omap2_dm_timer_init);
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
#
|
||||
|
||||
obj-y := clock.o cpu.o devices.o devices-common.o \
|
||||
id.o usb.o
|
||||
id.o usb.o timer.o
|
||||
obj-$(CONFIG_CACHE_L2X0) += cache-l2x0.o
|
||||
obj-$(CONFIG_UX500_SOC_DB5500) += cpu-db5500.o dma-db5500.o
|
||||
obj-$(CONFIG_UX500_SOC_DB8500) += cpu-db8500.o devices-db8500.o
|
||||
|
||||
@@ -10,12 +10,12 @@
|
||||
#include <linux/clk.h>
|
||||
#include <linux/mfd/db8500-prcmu.h>
|
||||
#include <linux/mfd/db5500-prcmu.h>
|
||||
#include <linux/clksrc-dbx500-prcmu.h>
|
||||
|
||||
#include <asm/hardware/gic.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/localtimer.h>
|
||||
|
||||
#include <plat/mtu.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/setup.h>
|
||||
#include <mach/devices.h>
|
||||
@@ -50,30 +50,3 @@ void __init ux500_init_irq(void)
|
||||
prcmu_early_init();
|
||||
clk_init();
|
||||
}
|
||||
|
||||
static void __init ux500_timer_init(void)
|
||||
{
|
||||
#ifdef CONFIG_LOCAL_TIMERS
|
||||
/* Setup the local timer base */
|
||||
if (cpu_is_u5500())
|
||||
twd_base = __io_address(U5500_TWD_BASE);
|
||||
else if (cpu_is_u8500())
|
||||
twd_base = __io_address(U8500_TWD_BASE);
|
||||
else
|
||||
ux500_unknown_soc();
|
||||
#endif
|
||||
if (cpu_is_u5500())
|
||||
mtu_base = __io_address(U5500_MTU0_BASE);
|
||||
else if (cpu_is_u8500ed())
|
||||
mtu_base = __io_address(U8500_MTU0_BASE_ED);
|
||||
else if (cpu_is_u8500())
|
||||
mtu_base = __io_address(U8500_MTU0_BASE);
|
||||
else
|
||||
ux500_unknown_soc();
|
||||
|
||||
nmdk_timer_init();
|
||||
}
|
||||
|
||||
struct sys_timer ux500_timer = {
|
||||
.init = ux500_timer_init,
|
||||
};
|
||||
|
||||
@@ -61,6 +61,8 @@
|
||||
#define U5500_SCR_BASE (U5500_PER4_BASE + 0x5000)
|
||||
#define U5500_DMC_BASE (U5500_PER4_BASE + 0x6000)
|
||||
#define U5500_PRCMU_BASE (U5500_PER4_BASE + 0x7000)
|
||||
#define U5500_PRCMU_TIMER_3_BASE (U5500_PER4_BASE + 0x07338)
|
||||
#define U5500_PRCMU_TIMER_4_BASE (U5500_PER4_BASE + 0x07450)
|
||||
#define U5500_MSP1_BASE (U5500_PER4_BASE + 0x9000)
|
||||
#define U5500_GPIO2_BASE (U5500_PER4_BASE + 0xA000)
|
||||
#define U5500_CDETECT_BASE (U5500_PER4_BASE + 0xF000)
|
||||
|
||||
@@ -102,10 +102,13 @@
|
||||
#define U8500_SCR_BASE (U8500_PER4_BASE + 0x05000)
|
||||
#define U8500_DMC_BASE (U8500_PER4_BASE + 0x06000)
|
||||
#define U8500_PRCMU_BASE (U8500_PER4_BASE + 0x07000)
|
||||
#define U8500_PRCMU_TIMER_3_BASE (U8500_PER4_BASE + 0x07338)
|
||||
#define U8500_PRCMU_TIMER_4_BASE (U8500_PER4_BASE + 0x07450)
|
||||
#define U8500_PRCMU_TCDM_BASE_V1 (U8500_PER4_BASE + 0x0f000)
|
||||
#define U8500_PRCMU_TCDM_BASE (U8500_PER4_BASE + 0x68000)
|
||||
#define U8500_PRCMU_TCPM_BASE (U8500_PER4_BASE + 0x60000)
|
||||
|
||||
|
||||
/* per3 base addresses */
|
||||
#define U8500_FSMC_BASE (U8500_PER3_BASE + 0x0000)
|
||||
#define U8500_SSP0_BASE (U8500_PER3_BASE + 0x2000)
|
||||
|
||||
@@ -0,0 +1,68 @@
|
||||
/*
|
||||
* Copyright (C) ST-Ericsson SA 2011
|
||||
*
|
||||
* License Terms: GNU General Public License v2
|
||||
* Author: Mattias Wallin <mattias.wallin@stericsson.com> for ST-Ericsson
|
||||
*/
|
||||
#include <linux/io.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/clksrc-dbx500-prcmu.h>
|
||||
|
||||
#include <asm/localtimer.h>
|
||||
|
||||
#include <plat/mtu.h>
|
||||
|
||||
#include <mach/setup.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
static void __init ux500_timer_init(void)
|
||||
{
|
||||
void __iomem *prcmu_timer_base;
|
||||
|
||||
if (cpu_is_u5500()) {
|
||||
#ifdef CONFIG_LOCAL_TIMERS
|
||||
twd_base = __io_address(U5500_TWD_BASE);
|
||||
#endif
|
||||
mtu_base = __io_address(U5500_MTU0_BASE);
|
||||
prcmu_timer_base = __io_address(U5500_PRCMU_TIMER_3_BASE);
|
||||
} else if (cpu_is_u8500()) {
|
||||
#ifdef CONFIG_LOCAL_TIMERS
|
||||
twd_base = __io_address(U8500_TWD_BASE);
|
||||
#endif
|
||||
mtu_base = __io_address(U8500_MTU0_BASE);
|
||||
prcmu_timer_base = __io_address(U8500_PRCMU_TIMER_4_BASE);
|
||||
} else {
|
||||
ux500_unknown_soc();
|
||||
}
|
||||
|
||||
/*
|
||||
* Here we register the timerblocks active in the system.
|
||||
* Localtimers (twd) is started when both cpu is up and running.
|
||||
* MTU register a clocksource, clockevent and sched_clock.
|
||||
* Since the MTU is located in the VAPE power domain
|
||||
* it will be cleared in sleep which makes it unsuitable.
|
||||
* We however need it as a timer tick (clockevent)
|
||||
* during boot to calibrate delay until twd is started.
|
||||
* RTC-RTT have problems as timer tick during boot since it is
|
||||
* depending on delay which is not yet calibrated. RTC-RTT is in the
|
||||
* always-on powerdomain and is used as clockevent instead of twd when
|
||||
* sleeping.
|
||||
* The PRCMU timer 4(3 for DB5500) register a clocksource and
|
||||
* sched_clock with higher rating then MTU since is always-on.
|
||||
*
|
||||
*/
|
||||
|
||||
nmdk_timer_init();
|
||||
clksrc_dbx500_prcmu_init(prcmu_timer_base);
|
||||
}
|
||||
|
||||
static void ux500_timer_reset(void)
|
||||
{
|
||||
nmdk_clkevt_reset();
|
||||
nmdk_clksrc_reset();
|
||||
}
|
||||
|
||||
struct sys_timer ux500_timer = {
|
||||
.init = ux500_timer_init,
|
||||
.resume = ux500_timer_reset,
|
||||
};
|
||||
@@ -15,10 +15,16 @@ if PLAT_NOMADIK
|
||||
|
||||
config HAS_MTU
|
||||
bool
|
||||
select HAVE_SCHED_CLOCK
|
||||
help
|
||||
Support for Multi Timer Unit. MTU provides access
|
||||
to multiple interrupt generating programmable
|
||||
32-bit free running decrementing counters.
|
||||
|
||||
config NOMADIK_MTU_SCHED_CLOCK
|
||||
bool
|
||||
depends on HAS_MTU
|
||||
select HAVE_SCHED_CLOCK
|
||||
help
|
||||
Use the Multi Timer Unit as the sched_clock.
|
||||
|
||||
endif
|
||||
|
||||
@@ -1,54 +1,11 @@
|
||||
#ifndef __PLAT_MTU_H
|
||||
#define __PLAT_MTU_H
|
||||
|
||||
/*
|
||||
* Guaranteed runtime conversion range in seconds for
|
||||
* the clocksource and clockevent.
|
||||
*/
|
||||
#define MTU_MIN_RANGE 4
|
||||
|
||||
/* should be set by the platform code */
|
||||
extern void __iomem *mtu_base;
|
||||
|
||||
/*
|
||||
* The MTU device hosts four different counters, with 4 set of
|
||||
* registers. These are register names.
|
||||
*/
|
||||
|
||||
#define MTU_IMSC 0x00 /* Interrupt mask set/clear */
|
||||
#define MTU_RIS 0x04 /* Raw interrupt status */
|
||||
#define MTU_MIS 0x08 /* Masked interrupt status */
|
||||
#define MTU_ICR 0x0C /* Interrupt clear register */
|
||||
|
||||
/* per-timer registers take 0..3 as argument */
|
||||
#define MTU_LR(x) (0x10 + 0x10 * (x) + 0x00) /* Load value */
|
||||
#define MTU_VAL(x) (0x10 + 0x10 * (x) + 0x04) /* Current value */
|
||||
#define MTU_CR(x) (0x10 + 0x10 * (x) + 0x08) /* Control reg */
|
||||
#define MTU_BGLR(x) (0x10 + 0x10 * (x) + 0x0c) /* At next overflow */
|
||||
|
||||
/* bits for the control register */
|
||||
#define MTU_CRn_ENA 0x80
|
||||
#define MTU_CRn_PERIODIC 0x40 /* if 0 = free-running */
|
||||
#define MTU_CRn_PRESCALE_MASK 0x0c
|
||||
#define MTU_CRn_PRESCALE_1 0x00
|
||||
#define MTU_CRn_PRESCALE_16 0x04
|
||||
#define MTU_CRn_PRESCALE_256 0x08
|
||||
#define MTU_CRn_32BITS 0x02
|
||||
#define MTU_CRn_ONESHOT 0x01 /* if 0 = wraps reloading from BGLR*/
|
||||
|
||||
/* Other registers are usual amba/primecell registers, currently not used */
|
||||
#define MTU_ITCR 0xff0
|
||||
#define MTU_ITOP 0xff4
|
||||
|
||||
#define MTU_PERIPH_ID0 0xfe0
|
||||
#define MTU_PERIPH_ID1 0xfe4
|
||||
#define MTU_PERIPH_ID2 0xfe8
|
||||
#define MTU_PERIPH_ID3 0xfeC
|
||||
|
||||
#define MTU_PCELL0 0xff0
|
||||
#define MTU_PCELL1 0xff4
|
||||
#define MTU_PCELL2 0xff8
|
||||
#define MTU_PCELL3 0xffC
|
||||
void nmdk_clkevt_reset(void);
|
||||
void nmdk_clksrc_reset(void);
|
||||
|
||||
#endif /* __PLAT_MTU_H */
|
||||
|
||||
|
||||
+107
-31
@@ -21,10 +21,59 @@
|
||||
#include <asm/mach/time.h>
|
||||
#include <asm/sched_clock.h>
|
||||
|
||||
#include <plat/mtu.h>
|
||||
/*
|
||||
* Guaranteed runtime conversion range in seconds for
|
||||
* the clocksource and clockevent.
|
||||
*/
|
||||
#define MTU_MIN_RANGE 4
|
||||
|
||||
/*
|
||||
* The MTU device hosts four different counters, with 4 set of
|
||||
* registers. These are register names.
|
||||
*/
|
||||
|
||||
#define MTU_IMSC 0x00 /* Interrupt mask set/clear */
|
||||
#define MTU_RIS 0x04 /* Raw interrupt status */
|
||||
#define MTU_MIS 0x08 /* Masked interrupt status */
|
||||
#define MTU_ICR 0x0C /* Interrupt clear register */
|
||||
|
||||
/* per-timer registers take 0..3 as argument */
|
||||
#define MTU_LR(x) (0x10 + 0x10 * (x) + 0x00) /* Load value */
|
||||
#define MTU_VAL(x) (0x10 + 0x10 * (x) + 0x04) /* Current value */
|
||||
#define MTU_CR(x) (0x10 + 0x10 * (x) + 0x08) /* Control reg */
|
||||
#define MTU_BGLR(x) (0x10 + 0x10 * (x) + 0x0c) /* At next overflow */
|
||||
|
||||
/* bits for the control register */
|
||||
#define MTU_CRn_ENA 0x80
|
||||
#define MTU_CRn_PERIODIC 0x40 /* if 0 = free-running */
|
||||
#define MTU_CRn_PRESCALE_MASK 0x0c
|
||||
#define MTU_CRn_PRESCALE_1 0x00
|
||||
#define MTU_CRn_PRESCALE_16 0x04
|
||||
#define MTU_CRn_PRESCALE_256 0x08
|
||||
#define MTU_CRn_32BITS 0x02
|
||||
#define MTU_CRn_ONESHOT 0x01 /* if 0 = wraps reloading from BGLR*/
|
||||
|
||||
/* Other registers are usual amba/primecell registers, currently not used */
|
||||
#define MTU_ITCR 0xff0
|
||||
#define MTU_ITOP 0xff4
|
||||
|
||||
#define MTU_PERIPH_ID0 0xfe0
|
||||
#define MTU_PERIPH_ID1 0xfe4
|
||||
#define MTU_PERIPH_ID2 0xfe8
|
||||
#define MTU_PERIPH_ID3 0xfeC
|
||||
|
||||
#define MTU_PCELL0 0xff0
|
||||
#define MTU_PCELL1 0xff4
|
||||
#define MTU_PCELL2 0xff8
|
||||
#define MTU_PCELL3 0xffC
|
||||
|
||||
static bool clkevt_periodic;
|
||||
static u32 clk_prescale;
|
||||
static u32 nmdk_cycle; /* write-once */
|
||||
|
||||
void __iomem *mtu_base; /* Assigned by machine code */
|
||||
|
||||
#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
|
||||
/*
|
||||
* Override the global weak sched_clock symbol with this
|
||||
* local implementation which uses the clocksource to get some
|
||||
@@ -48,32 +97,56 @@ static void notrace nomadik_update_sched_clock(void)
|
||||
u32 cyc = -readl(mtu_base + MTU_VAL(0));
|
||||
update_sched_clock(&cd, cyc, (u32)~0);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Clockevent device: use one-shot mode */
|
||||
static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev)
|
||||
{
|
||||
writel(1 << 1, mtu_base + MTU_IMSC);
|
||||
writel(evt, mtu_base + MTU_LR(1));
|
||||
/* Load highest value, enable device, enable interrupts */
|
||||
writel(MTU_CRn_ONESHOT | clk_prescale |
|
||||
MTU_CRn_32BITS | MTU_CRn_ENA,
|
||||
mtu_base + MTU_CR(1));
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nmdk_clkevt_reset(void)
|
||||
{
|
||||
if (clkevt_periodic) {
|
||||
|
||||
/* Timer: configure load and background-load, and fire it up */
|
||||
writel(nmdk_cycle, mtu_base + MTU_LR(1));
|
||||
writel(nmdk_cycle, mtu_base + MTU_BGLR(1));
|
||||
|
||||
writel(MTU_CRn_PERIODIC | clk_prescale |
|
||||
MTU_CRn_32BITS | MTU_CRn_ENA,
|
||||
mtu_base + MTU_CR(1));
|
||||
writel(1 << 1, mtu_base + MTU_IMSC);
|
||||
} else {
|
||||
/* Generate an interrupt to start the clockevent again */
|
||||
(void) nmdk_clkevt_next(nmdk_cycle, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
static void nmdk_clkevt_mode(enum clock_event_mode mode,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
u32 cr;
|
||||
|
||||
switch (mode) {
|
||||
case CLOCK_EVT_MODE_PERIODIC:
|
||||
pr_err("%s: periodic mode not supported\n", __func__);
|
||||
clkevt_periodic = true;
|
||||
nmdk_clkevt_reset();
|
||||
break;
|
||||
case CLOCK_EVT_MODE_ONESHOT:
|
||||
/* Load highest value, enable device, enable interrupts */
|
||||
cr = readl(mtu_base + MTU_CR(1));
|
||||
writel(0, mtu_base + MTU_LR(1));
|
||||
writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(1));
|
||||
writel(1 << 1, mtu_base + MTU_IMSC);
|
||||
clkevt_periodic = false;
|
||||
break;
|
||||
case CLOCK_EVT_MODE_SHUTDOWN:
|
||||
case CLOCK_EVT_MODE_UNUSED:
|
||||
/* disable irq */
|
||||
writel(0, mtu_base + MTU_IMSC);
|
||||
/* disable timer */
|
||||
cr = readl(mtu_base + MTU_CR(1));
|
||||
cr &= ~MTU_CRn_ENA;
|
||||
writel(cr, mtu_base + MTU_CR(1));
|
||||
writel(0, mtu_base + MTU_CR(1));
|
||||
/* load some high default value */
|
||||
writel(0xffffffff, mtu_base + MTU_LR(1));
|
||||
break;
|
||||
@@ -82,16 +155,9 @@ static void nmdk_clkevt_mode(enum clock_event_mode mode,
|
||||
}
|
||||
}
|
||||
|
||||
static int nmdk_clkevt_next(unsigned long evt, struct clock_event_device *ev)
|
||||
{
|
||||
/* writing the value has immediate effect */
|
||||
writel(evt, mtu_base + MTU_LR(1));
|
||||
return 0;
|
||||
}
|
||||
|
||||
static struct clock_event_device nmdk_clkevt = {
|
||||
.name = "mtu_1",
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT,
|
||||
.features = CLOCK_EVT_FEAT_ONESHOT | CLOCK_EVT_FEAT_PERIODIC,
|
||||
.rating = 200,
|
||||
.set_mode = nmdk_clkevt_mode,
|
||||
.set_next_event = nmdk_clkevt_next,
|
||||
@@ -116,11 +182,23 @@ static struct irqaction nmdk_timer_irq = {
|
||||
.dev_id = &nmdk_clkevt,
|
||||
};
|
||||
|
||||
void nmdk_clksrc_reset(void)
|
||||
{
|
||||
/* Disable */
|
||||
writel(0, mtu_base + MTU_CR(0));
|
||||
|
||||
/* ClockSource: configure load and background-load, and fire it up */
|
||||
writel(nmdk_cycle, mtu_base + MTU_LR(0));
|
||||
writel(nmdk_cycle, mtu_base + MTU_BGLR(0));
|
||||
|
||||
writel(clk_prescale | MTU_CRn_32BITS | MTU_CRn_ENA,
|
||||
mtu_base + MTU_CR(0));
|
||||
}
|
||||
|
||||
void __init nmdk_timer_init(void)
|
||||
{
|
||||
unsigned long rate;
|
||||
struct clk *clk0;
|
||||
u32 cr = MTU_CRn_32BITS;
|
||||
|
||||
clk0 = clk_get_sys("mtu0", NULL);
|
||||
BUG_ON(IS_ERR(clk0));
|
||||
@@ -138,30 +216,28 @@ void __init nmdk_timer_init(void)
|
||||
rate = clk_get_rate(clk0);
|
||||
if (rate > 32000000) {
|
||||
rate /= 16;
|
||||
cr |= MTU_CRn_PRESCALE_16;
|
||||
clk_prescale = MTU_CRn_PRESCALE_16;
|
||||
} else {
|
||||
cr |= MTU_CRn_PRESCALE_1;
|
||||
clk_prescale = MTU_CRn_PRESCALE_1;
|
||||
}
|
||||
|
||||
nmdk_cycle = (rate + HZ/2) / HZ;
|
||||
|
||||
|
||||
/* Timer 0 is the free running clocksource */
|
||||
writel(cr, mtu_base + MTU_CR(0));
|
||||
writel(0, mtu_base + MTU_LR(0));
|
||||
writel(0, mtu_base + MTU_BGLR(0));
|
||||
writel(cr | MTU_CRn_ENA, mtu_base + MTU_CR(0));
|
||||
nmdk_clksrc_reset();
|
||||
|
||||
if (clocksource_mmio_init(mtu_base + MTU_VAL(0), "mtu_0",
|
||||
rate, 200, 32, clocksource_mmio_readl_down))
|
||||
pr_err("timer: failed to initialize clock source %s\n",
|
||||
"mtu_0");
|
||||
|
||||
#ifdef CONFIG_NOMADIK_MTU_SCHED_CLOCK
|
||||
init_sched_clock(&cd, nomadik_update_sched_clock, 32, rate);
|
||||
|
||||
#endif
|
||||
/* Timer 1 is used for events */
|
||||
|
||||
clockevents_calc_mult_shift(&nmdk_clkevt, rate, MTU_MIN_RANGE);
|
||||
|
||||
writel(cr | MTU_CRn_ONESHOT, mtu_base + MTU_CR(1)); /* off, currently */
|
||||
|
||||
nmdk_clkevt.max_delta_ns =
|
||||
clockevent_delta2ns(0xffffffff, &nmdk_clkevt);
|
||||
nmdk_clkevt.min_delta_ns =
|
||||
|
||||
+418
-309
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user