Merge remote-tracking branch 'tip/timers/core' into afs-next

These AFS patches need the timer_reduce() patch from timers/core.

Signed-off-by: David Howells <dhowells@redhat.com>
This commit is contained in:
David Howells 2017-11-13 15:36:33 +00:00
commit 81445e63e6
251 changed files with 1814 additions and 1864 deletions

View File

@ -20,16 +20,16 @@ Required Properties:
(CMT1 on sh73a0 and r8a7740) (CMT1 on sh73a0 and r8a7740)
This is a fallback for the above renesas,cmt-48-* entries. This is a fallback for the above renesas,cmt-48-* entries.
- "renesas,cmt0-r8a73a4" for the 32-bit CMT0 device included in r8a73a4. - "renesas,r8a73a4-cmt0" for the 32-bit CMT0 device included in r8a73a4.
- "renesas,cmt1-r8a73a4" for the 48-bit CMT1 device included in r8a73a4. - "renesas,r8a73a4-cmt1" for the 48-bit CMT1 device included in r8a73a4.
- "renesas,cmt0-r8a7790" for the 32-bit CMT0 device included in r8a7790. - "renesas,r8a7790-cmt0" for the 32-bit CMT0 device included in r8a7790.
- "renesas,cmt1-r8a7790" for the 48-bit CMT1 device included in r8a7790. - "renesas,r8a7790-cmt1" for the 48-bit CMT1 device included in r8a7790.
- "renesas,cmt0-r8a7791" for the 32-bit CMT0 device included in r8a7791. - "renesas,r8a7791-cmt0" for the 32-bit CMT0 device included in r8a7791.
- "renesas,cmt1-r8a7791" for the 48-bit CMT1 device included in r8a7791. - "renesas,r8a7791-cmt1" for the 48-bit CMT1 device included in r8a7791.
- "renesas,cmt0-r8a7793" for the 32-bit CMT0 device included in r8a7793. - "renesas,r8a7793-cmt0" for the 32-bit CMT0 device included in r8a7793.
- "renesas,cmt1-r8a7793" for the 48-bit CMT1 device included in r8a7793. - "renesas,r8a7793-cmt1" for the 48-bit CMT1 device included in r8a7793.
- "renesas,cmt0-r8a7794" for the 32-bit CMT0 device included in r8a7794. - "renesas,r8a7794-cmt0" for the 32-bit CMT0 device included in r8a7794.
- "renesas,cmt1-r8a7794" for the 48-bit CMT1 device included in r8a7794. - "renesas,r8a7794-cmt1" for the 48-bit CMT1 device included in r8a7794.
- "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2. - "renesas,rcar-gen2-cmt0" for 32-bit CMT0 devices included in R-Car Gen2.
- "renesas,rcar-gen2-cmt1" for 48-bit CMT1 devices included in R-Car Gen2. - "renesas,rcar-gen2-cmt1" for 48-bit CMT1 devices included in R-Car Gen2.
@ -46,7 +46,7 @@ Required Properties:
Example: R8A7790 (R-Car H2) CMT0 and CMT1 nodes Example: R8A7790 (R-Car H2) CMT0 and CMT1 nodes
cmt0: timer@ffca0000 { cmt0: timer@ffca0000 {
compatible = "renesas,cmt0-r8a7790", "renesas,rcar-gen2-cmt0"; compatible = "renesas,r8a7790-cmt0", "renesas,rcar-gen2-cmt0";
reg = <0 0xffca0000 0 0x1004>; reg = <0 0xffca0000 0 0x1004>;
interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>, interrupts = <0 142 IRQ_TYPE_LEVEL_HIGH>,
<0 142 IRQ_TYPE_LEVEL_HIGH>; <0 142 IRQ_TYPE_LEVEL_HIGH>;
@ -55,7 +55,7 @@ Example: R8A7790 (R-Car H2) CMT0 and CMT1 nodes
}; };
cmt1: timer@e6130000 { cmt1: timer@e6130000 {
compatible = "renesas,cmt1-r8a7790", "renesas,rcar-gen2-cmt1"; compatible = "renesas,r8a7790-cmt1", "renesas,rcar-gen2-cmt1";
reg = <0 0xe6130000 0 0x1004>; reg = <0 0xe6130000 0 0x1004>;
interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>, interrupts = <0 120 IRQ_TYPE_LEVEL_HIGH>,
<0 121 IRQ_TYPE_LEVEL_HIGH>, <0 121 IRQ_TYPE_LEVEL_HIGH>,

View File

@ -3450,7 +3450,8 @@ M: Thomas Gleixner <tglx@linutronix.de>
L: linux-kernel@vger.kernel.org L: linux-kernel@vger.kernel.org
T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core T: git git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git timers/core
S: Supported S: Supported
F: drivers/clocksource F: drivers/clocksource/
F: Documentation/devicetree/bindings/timer/
CMPC ACPI DRIVER CMPC ACPI DRIVER
M: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com> M: Thadeu Lima de Souza Cascardo <cascardo@holoscopio.com>

View File

@ -136,19 +136,14 @@ struct pci_ops dc21285_ops = {
static struct timer_list serr_timer; static struct timer_list serr_timer;
static struct timer_list perr_timer; static struct timer_list perr_timer;
static void dc21285_enable_error(unsigned long __data) static void dc21285_enable_error(struct timer_list *timer)
{ {
switch (__data) { del_timer(timer);
case IRQ_PCI_SERR:
del_timer(&serr_timer);
break;
case IRQ_PCI_PERR: if (timer == &serr_timer)
del_timer(&perr_timer); enable_irq(IRQ_PCI_SERR);
break; else if (timer == &perr_timer)
} enable_irq(IRQ_PCI_PERR);
enable_irq(__data);
} }
/* /*
@ -323,13 +318,8 @@ void __init dc21285_preinit(void)
*CSR_PCICMD = (*CSR_PCICMD & 0xffff) | PCICMD_ERROR_BITS; *CSR_PCICMD = (*CSR_PCICMD & 0xffff) | PCICMD_ERROR_BITS;
} }
init_timer(&serr_timer); timer_setup(&serr_timer, dc21285_enable_error, 0);
init_timer(&perr_timer); timer_setup(&perr_timer, dc21285_enable_error, 0);
serr_timer.data = IRQ_PCI_SERR;
serr_timer.function = dc21285_enable_error;
perr_timer.data = IRQ_PCI_PERR;
perr_timer.function = dc21285_enable_error;
/* /*
* We don't care if these fail. * We don't care if these fail.

View File

@ -175,7 +175,7 @@ static int power_button_countdown;
#define PBUTTON_HOLDDOWN_COUNT 4 /* 2 secs */ #define PBUTTON_HOLDDOWN_COUNT 4 /* 2 secs */
static void dsmg600_power_handler(unsigned long data); static void dsmg600_power_handler(unsigned long data);
static DEFINE_TIMER(dsmg600_power_timer, dsmg600_power_handler, 0, 0); static DEFINE_TIMER(dsmg600_power_timer, dsmg600_power_handler);
static void dsmg600_power_handler(unsigned long data) static void dsmg600_power_handler(unsigned long data)
{ {

View File

@ -198,7 +198,7 @@ static int power_button_countdown;
#define PBUTTON_HOLDDOWN_COUNT 4 /* 2 secs */ #define PBUTTON_HOLDDOWN_COUNT 4 /* 2 secs */
static void nas100d_power_handler(unsigned long data); static void nas100d_power_handler(unsigned long data);
static DEFINE_TIMER(nas100d_power_timer, nas100d_power_handler, 0, 0); static DEFINE_TIMER(nas100d_power_timer, nas100d_power_handler);
static void nas100d_power_handler(unsigned long data) static void nas100d_power_handler(unsigned long data)
{ {

View File

@ -381,14 +381,11 @@ static struct pxafb_mach_info sharp_lm8v31 = {
#define MMC_POLL_RATE msecs_to_jiffies(1000) #define MMC_POLL_RATE msecs_to_jiffies(1000)
static void lubbock_mmc_poll(unsigned long);
static irq_handler_t mmc_detect_int; static irq_handler_t mmc_detect_int;
static void *mmc_detect_int_data;
static struct timer_list mmc_timer;
static struct timer_list mmc_timer = { static void lubbock_mmc_poll(struct timer_list *unused)
.function = lubbock_mmc_poll,
};
static void lubbock_mmc_poll(unsigned long data)
{ {
unsigned long flags; unsigned long flags;
@ -401,7 +398,7 @@ static void lubbock_mmc_poll(unsigned long data)
if (LUB_IRQ_SET_CLR & (1 << 0)) if (LUB_IRQ_SET_CLR & (1 << 0))
mod_timer(&mmc_timer, jiffies + MMC_POLL_RATE); mod_timer(&mmc_timer, jiffies + MMC_POLL_RATE);
else { else {
(void) mmc_detect_int(LUBBOCK_SD_IRQ, (void *)data); (void) mmc_detect_int(LUBBOCK_SD_IRQ, mmc_detect_int_data);
enable_irq(LUBBOCK_SD_IRQ); enable_irq(LUBBOCK_SD_IRQ);
} }
} }
@ -421,8 +418,8 @@ static int lubbock_mci_init(struct device *dev,
{ {
/* detect card insert/eject */ /* detect card insert/eject */
mmc_detect_int = detect_int; mmc_detect_int = detect_int;
init_timer(&mmc_timer); mmc_detect_int_data = data;
mmc_timer.data = (unsigned long) data; timer_setup(&mmc_timer, lubbock_mmc_poll, 0);
return request_irq(LUBBOCK_SD_IRQ, lubbock_detect_int, return request_irq(LUBBOCK_SD_IRQ, lubbock_detect_int,
0, "lubbock-sd-detect", data); 0, "lubbock-sd-detect", data);
} }

View File

@ -341,7 +341,7 @@ static void sharpsl_charge_toggle(struct work_struct *private_)
sharpsl_pm.charge_start_time = jiffies; sharpsl_pm.charge_start_time = jiffies;
} }
static void sharpsl_ac_timer(unsigned long data) static void sharpsl_ac_timer(struct timer_list *unused)
{ {
int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN); int acin = sharpsl_pm.machinfo->read_devdata(SHARPSL_STATUS_ACIN);
@ -366,7 +366,7 @@ static irqreturn_t sharpsl_ac_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void sharpsl_chrg_full_timer(unsigned long data) static void sharpsl_chrg_full_timer(struct timer_list *unused)
{ {
dev_dbg(sharpsl_pm.dev, "Charge Full at time: %lx\n", jiffies); dev_dbg(sharpsl_pm.dev, "Charge Full at time: %lx\n", jiffies);
@ -841,9 +841,9 @@ static int sharpsl_pm_probe(struct platform_device *pdev)
sharpsl_pm.charge_mode = CHRG_OFF; sharpsl_pm.charge_mode = CHRG_OFF;
sharpsl_pm.flags = 0; sharpsl_pm.flags = 0;
setup_timer(&sharpsl_pm.ac_timer, sharpsl_ac_timer, 0UL); timer_setup(&sharpsl_pm.ac_timer, sharpsl_ac_timer, 0);
setup_timer(&sharpsl_pm.chrg_full_timer, sharpsl_chrg_full_timer, 0UL); timer_setup(&sharpsl_pm.chrg_full_timer, sharpsl_chrg_full_timer, 0);
led_trigger_register_simple("sharpsl-charge", &sharpsl_charge_led_trigger); led_trigger_register_simple("sharpsl-charge", &sharpsl_charge_led_trigger);

View File

@ -17,6 +17,8 @@
#include <asm/sn/types.h> #include <asm/sn/types.h>
#include <asm/sn/shub_mmr.h> #include <asm/sn/shub_mmr.h>
struct nodepda_s;
#define IBCT_NOTIFY (0x1UL << 4) #define IBCT_NOTIFY (0x1UL << 4)
#define IBCT_ZFIL_MODE (0x1UL << 0) #define IBCT_ZFIL_MODE (0x1UL << 0)
@ -210,7 +212,7 @@ struct bteinfo_s {
*/ */
extern bte_result_t bte_copy(u64, u64, u64, u64, void *); extern bte_result_t bte_copy(u64, u64, u64, u64, void *);
extern bte_result_t bte_unaligned_copy(u64, u64, u64, u64); extern bte_result_t bte_unaligned_copy(u64, u64, u64, u64);
extern void bte_error_handler(unsigned long); extern void bte_error_handler(struct nodepda_s *);
#define bte_zero(dest, len, mode, notification) \ #define bte_zero(dest, len, mode, notification) \
bte_copy(0, dest, len, ((mode) | BTE_ZERO_FILL), notification) bte_copy(0, dest, len, ((mode) | BTE_ZERO_FILL), notification)

View File

@ -1513,7 +1513,7 @@ ia64_mca_cmc_int_caller(int cmc_irq, void *arg)
* *
*/ */
static void static void
ia64_mca_cmc_poll (unsigned long dummy) ia64_mca_cmc_poll (struct timer_list *unused)
{ {
/* Trigger a CMC interrupt cascade */ /* Trigger a CMC interrupt cascade */
platform_send_ipi(cpumask_first(cpu_online_mask), IA64_CMCP_VECTOR, platform_send_ipi(cpumask_first(cpu_online_mask), IA64_CMCP_VECTOR,
@ -1590,7 +1590,7 @@ ia64_mca_cpe_int_caller(int cpe_irq, void *arg)
* *
*/ */
static void static void
ia64_mca_cpe_poll (unsigned long dummy) ia64_mca_cpe_poll (struct timer_list *unused)
{ {
/* Trigger a CPE interrupt cascade */ /* Trigger a CPE interrupt cascade */
platform_send_ipi(cpumask_first(cpu_online_mask), IA64_CPEP_VECTOR, platform_send_ipi(cpumask_first(cpu_online_mask), IA64_CPEP_VECTOR,
@ -2098,7 +2098,7 @@ ia64_mca_late_init(void)
return 0; return 0;
/* Setup the CMCI/P vector and handler */ /* Setup the CMCI/P vector and handler */
setup_timer(&cmc_poll_timer, ia64_mca_cmc_poll, 0UL); timer_setup(&cmc_poll_timer, ia64_mca_cmc_poll, 0);
/* Unmask/enable the vector */ /* Unmask/enable the vector */
cmc_polling_enabled = 0; cmc_polling_enabled = 0;
@ -2109,7 +2109,7 @@ ia64_mca_late_init(void)
#ifdef CONFIG_ACPI #ifdef CONFIG_ACPI
/* Setup the CPEI/P vector and handler */ /* Setup the CPEI/P vector and handler */
cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI); cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI);
setup_timer(&cpe_poll_timer, ia64_mca_cpe_poll, 0UL); timer_setup(&cpe_poll_timer, ia64_mca_cpe_poll, 0);
{ {
unsigned int irq; unsigned int irq;

View File

@ -263,7 +263,7 @@ salinfo_timeout_check(struct salinfo_data *data)
} }
static void static void
salinfo_timeout (unsigned long arg) salinfo_timeout(struct timer_list *unused)
{ {
ia64_mlogbuf_dump(); ia64_mlogbuf_dump();
salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_MCA); salinfo_timeout_check(salinfo_data + SAL_INFO_TYPE_MCA);
@ -623,9 +623,8 @@ salinfo_init(void)
*sdir++ = salinfo_dir; *sdir++ = salinfo_dir;
init_timer(&salinfo_timer); timer_setup(&salinfo_timer, salinfo_timeout, 0);
salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY; salinfo_timer.expires = jiffies + SALINFO_TIMER_DELAY;
salinfo_timer.function = &salinfo_timeout;
add_timer(&salinfo_timer); add_timer(&salinfo_timer);
i = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "ia64/salinfo:online", i = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "ia64/salinfo:online",

View File

@ -219,7 +219,7 @@ retry_bteop:
BTE_LNSTAT_LOAD(bte), *bte->most_rcnt_na) ); BTE_LNSTAT_LOAD(bte), *bte->most_rcnt_na) );
bte->bte_error_count++; bte->bte_error_count++;
bte->bh_error = IBLS_ERROR; bte->bh_error = IBLS_ERROR;
bte_error_handler((unsigned long)NODEPDA(bte->bte_cnode)); bte_error_handler(NODEPDA(bte->bte_cnode));
*bte->most_rcnt_na = BTE_WORD_AVAILABLE; *bte->most_rcnt_na = BTE_WORD_AVAILABLE;
goto retry_bteop; goto retry_bteop;
} }
@ -414,6 +414,12 @@ EXPORT_SYMBOL(bte_unaligned_copy);
* Block Transfer Engine initialization functions. * Block Transfer Engine initialization functions.
* *
***********************************************************************/ ***********************************************************************/
static void bte_recovery_timeout(struct timer_list *t)
{
struct nodepda_s *nodepda = from_timer(nodepda, t, bte_recovery_timer);
bte_error_handler(nodepda);
}
/* /*
* bte_init_node(nodepda, cnode) * bte_init_node(nodepda, cnode)
@ -436,9 +442,7 @@ void bte_init_node(nodepda_t * mynodepda, cnodeid_t cnode)
* will point at this one bte_recover structure to get the lock. * will point at this one bte_recover structure to get the lock.
*/ */
spin_lock_init(&mynodepda->bte_recovery_lock); spin_lock_init(&mynodepda->bte_recovery_lock);
init_timer(&mynodepda->bte_recovery_timer); timer_setup(&mynodepda->bte_recovery_timer, bte_recovery_timeout, 0);
mynodepda->bte_recovery_timer.function = bte_error_handler;
mynodepda->bte_recovery_timer.data = (unsigned long)mynodepda;
for (i = 0; i < BTES_PER_NODE; i++) { for (i = 0; i < BTES_PER_NODE; i++) {
u64 *base_addr; u64 *base_addr;

View File

@ -27,15 +27,12 @@
* transfers to be queued. * transfers to be queued.
*/ */
void bte_error_handler(unsigned long);
/* /*
* Wait until all BTE related CRBs are completed * Wait until all BTE related CRBs are completed
* and then reset the interfaces. * and then reset the interfaces.
*/ */
int shub1_bte_error_handler(unsigned long _nodepda) static int shub1_bte_error_handler(struct nodepda_s *err_nodepda)
{ {
struct nodepda_s *err_nodepda = (struct nodepda_s *)_nodepda;
struct timer_list *recovery_timer = &err_nodepda->bte_recovery_timer; struct timer_list *recovery_timer = &err_nodepda->bte_recovery_timer;
nasid_t nasid; nasid_t nasid;
int i; int i;
@ -131,9 +128,8 @@ int shub1_bte_error_handler(unsigned long _nodepda)
* Wait until all BTE related CRBs are completed * Wait until all BTE related CRBs are completed
* and then reset the interfaces. * and then reset the interfaces.
*/ */
int shub2_bte_error_handler(unsigned long _nodepda) static int shub2_bte_error_handler(struct nodepda_s *err_nodepda)
{ {
struct nodepda_s *err_nodepda = (struct nodepda_s *)_nodepda;
struct timer_list *recovery_timer = &err_nodepda->bte_recovery_timer; struct timer_list *recovery_timer = &err_nodepda->bte_recovery_timer;
struct bteinfo_s *bte; struct bteinfo_s *bte;
nasid_t nasid; nasid_t nasid;
@ -170,9 +166,8 @@ int shub2_bte_error_handler(unsigned long _nodepda)
* Wait until all BTE related CRBs are completed * Wait until all BTE related CRBs are completed
* and then reset the interfaces. * and then reset the interfaces.
*/ */
void bte_error_handler(unsigned long _nodepda) void bte_error_handler(struct nodepda_s *err_nodepda)
{ {
struct nodepda_s *err_nodepda = (struct nodepda_s *)_nodepda;
spinlock_t *recovery_lock = &err_nodepda->bte_recovery_lock; spinlock_t *recovery_lock = &err_nodepda->bte_recovery_lock;
int i; int i;
unsigned long irq_flags; unsigned long irq_flags;
@ -199,12 +194,12 @@ void bte_error_handler(unsigned long _nodepda)
} }
if (is_shub1()) { if (is_shub1()) {
if (shub1_bte_error_handler(_nodepda)) { if (shub1_bte_error_handler(err_nodepda)) {
spin_unlock_irqrestore(recovery_lock, irq_flags); spin_unlock_irqrestore(recovery_lock, irq_flags);
return; return;
} }
} else { } else {
if (shub2_bte_error_handler(_nodepda)) { if (shub2_bte_error_handler(err_nodepda)) {
spin_unlock_irqrestore(recovery_lock, irq_flags); spin_unlock_irqrestore(recovery_lock, irq_flags);
return; return;
} }
@ -255,6 +250,6 @@ bte_crb_error_handler(cnodeid_t cnode, int btenum,
BTE_PRINTK(("Got an error on cnode %d bte %d: HW error type 0x%x\n", BTE_PRINTK(("Got an error on cnode %d bte %d: HW error type 0x%x\n",
bte->bte_cnode, bte->bte_num, ioe->ie_errortype)); bte->bte_cnode, bte->bte_num, ioe->ie_errortype));
bte_error_handler((unsigned long) NODEPDA(cnode)); bte_error_handler(NODEPDA(cnode));
} }

View File

@ -50,7 +50,7 @@ static irqreturn_t hub_eint_handler(int irq, void *arg)
if ((int)ret_stuff.v0) if ((int)ret_stuff.v0)
panic("%s: Fatal TIO Error", __func__); panic("%s: Fatal TIO Error", __func__);
} else } else
bte_error_handler((unsigned long)NODEPDA(nasid_to_cnodeid(nasid))); bte_error_handler(NODEPDA(nasid_to_cnodeid(nasid)));
return IRQ_HANDLED; return IRQ_HANDLED;
} }

View File

@ -72,7 +72,7 @@ static void sn_cpei_handler(int irq, void *devid, struct pt_regs *regs)
ia64_sn_plat_cpei_handler(); ia64_sn_plat_cpei_handler();
} }
static void sn_cpei_timer_handler(unsigned long dummy) static void sn_cpei_timer_handler(struct timer_list *unused)
{ {
sn_cpei_handler(-1, NULL, NULL); sn_cpei_handler(-1, NULL, NULL);
mod_timer(&sn_cpei_timer, jiffies + CPEI_INTERVAL); mod_timer(&sn_cpei_timer, jiffies + CPEI_INTERVAL);
@ -80,9 +80,8 @@ static void sn_cpei_timer_handler(unsigned long dummy)
void sn_init_cpei_timer(void) void sn_init_cpei_timer(void)
{ {
init_timer(&sn_cpei_timer); timer_setup(&sn_cpei_timer, sn_cpei_timer_handler, 0);
sn_cpei_timer.expires = jiffies + CPEI_INTERVAL; sn_cpei_timer.expires = jiffies + CPEI_INTERVAL;
sn_cpei_timer.function = sn_cpei_timer_handler;
add_timer(&sn_cpei_timer); add_timer(&sn_cpei_timer);
} }

View File

@ -66,7 +66,7 @@ void __init amiga_init_sound(void)
} }
static void nosound( unsigned long ignored ); static void nosound( unsigned long ignored );
static DEFINE_TIMER(sound_timer, nosound, 0, 0); static DEFINE_TIMER(sound_timer, nosound);
void amiga_mksound( unsigned int hz, unsigned int ticks ) void amiga_mksound( unsigned int hz, unsigned int ticks )
{ {

View File

@ -57,7 +57,7 @@ static void ( *mac_special_bell )( unsigned int, unsigned int, unsigned int );
/* /*
* our timer to start/continue/stop the bell * our timer to start/continue/stop the bell
*/ */
static DEFINE_TIMER(mac_sound_timer, mac_nosound, 0, 0); static DEFINE_TIMER(mac_sound_timer, mac_nosound);
/* /*
* Sort of initialize the sound chip (called from mac_mksound on the first * Sort of initialize the sound chip (called from mac_mksound on the first

View File

@ -36,10 +36,10 @@ void mips_display_message(const char *str)
} }
} }
static void scroll_display_message(unsigned long data); static void scroll_display_message(unsigned long unused);
static DEFINE_TIMER(mips_scroll_timer, scroll_display_message, HZ, 0); static DEFINE_TIMER(mips_scroll_timer, scroll_display_message);
static void scroll_display_message(unsigned long data) static void scroll_display_message(unsigned long unused)
{ {
mips_display_message(&display_string[display_count++]); mips_display_message(&display_string[display_count++]);
if (display_count == max_display_count) if (display_count == max_display_count)

View File

@ -38,6 +38,7 @@
#define PANIC_FREQ (HZ / 8) #define PANIC_FREQ (HZ / 8)
static struct timer_list power_timer, blink_timer, debounce_timer; static struct timer_list power_timer, blink_timer, debounce_timer;
static unsigned long blink_timer_timeout;
#define MACHINE_PANICED 1 #define MACHINE_PANICED 1
#define MACHINE_SHUTTING_DOWN 2 #define MACHINE_SHUTTING_DOWN 2
@ -81,21 +82,21 @@ static void __noreturn sgi_machine_halt(void)
ArcEnterInteractiveMode(); ArcEnterInteractiveMode();
} }
static void power_timeout(unsigned long data) static void power_timeout(struct timer_list *unused)
{ {
sgi_machine_power_off(); sgi_machine_power_off();
} }
static void blink_timeout(unsigned long data) static void blink_timeout(struct timer_list *unused)
{ {
/* XXX fix this for fullhouse */ /* XXX fix this for fullhouse */
sgi_ioc_reset ^= (SGIOC_RESET_LC0OFF|SGIOC_RESET_LC1OFF); sgi_ioc_reset ^= (SGIOC_RESET_LC0OFF|SGIOC_RESET_LC1OFF);
sgioc->reset = sgi_ioc_reset; sgioc->reset = sgi_ioc_reset;
mod_timer(&blink_timer, jiffies + data); mod_timer(&blink_timer, jiffies + blink_timer_timeout);
} }
static void debounce(unsigned long data) static void debounce(struct timer_list *unused)
{ {
del_timer(&debounce_timer); del_timer(&debounce_timer);
if (sgint->istat1 & SGINT_ISTAT1_PWR) { if (sgint->istat1 & SGINT_ISTAT1_PWR) {
@ -128,11 +129,10 @@ static inline void power_button(void)
} }
machine_state |= MACHINE_SHUTTING_DOWN; machine_state |= MACHINE_SHUTTING_DOWN;
blink_timer.data = POWERDOWN_FREQ; blink_timer_timeout = POWERDOWN_FREQ;
blink_timeout(POWERDOWN_FREQ); blink_timeout(&blink_timer);
init_timer(&power_timer); timer_setup(&power_timer, power_timeout, 0);
power_timer.function = power_timeout;
power_timer.expires = jiffies + POWERDOWN_TIMEOUT * HZ; power_timer.expires = jiffies + POWERDOWN_TIMEOUT * HZ;
add_timer(&power_timer); add_timer(&power_timer);
} }
@ -147,8 +147,7 @@ static irqreturn_t panel_int(int irq, void *dev_id)
if (sgint->istat1 & SGINT_ISTAT1_PWR) { if (sgint->istat1 & SGINT_ISTAT1_PWR) {
/* Wait until interrupt goes away */ /* Wait until interrupt goes away */
disable_irq_nosync(SGI_PANEL_IRQ); disable_irq_nosync(SGI_PANEL_IRQ);
init_timer(&debounce_timer); timer_setup(&debounce_timer, debounce, 0);
debounce_timer.function = debounce;
debounce_timer.expires = jiffies + 5; debounce_timer.expires = jiffies + 5;
add_timer(&debounce_timer); add_timer(&debounce_timer);
} }
@ -171,8 +170,8 @@ static int panic_event(struct notifier_block *this, unsigned long event,
return NOTIFY_DONE; return NOTIFY_DONE;
machine_state |= MACHINE_PANICED; machine_state |= MACHINE_PANICED;
blink_timer.data = PANIC_FREQ; blink_timer_timeout = PANIC_FREQ;
blink_timeout(PANIC_FREQ); blink_timeout(&blink_timer);
return NOTIFY_DONE; return NOTIFY_DONE;
} }
@ -195,8 +194,7 @@ static int __init reboot_setup(void)
return res; return res;
} }
init_timer(&blink_timer); timer_setup(&blink_timer, blink_timeout, 0);
blink_timer.function = blink_timeout;
atomic_notifier_chain_register(&panic_notifier_list, &panic_block); atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
return 0; return 0;

View File

@ -38,6 +38,7 @@
extern struct platform_device ip32_rtc_device; extern struct platform_device ip32_rtc_device;
static struct timer_list power_timer, blink_timer; static struct timer_list power_timer, blink_timer;
static unsigned long blink_timer_timeout;
static int has_panicked, shutting_down; static int has_panicked, shutting_down;
static __noreturn void ip32_poweroff(void *data) static __noreturn void ip32_poweroff(void *data)
@ -71,11 +72,11 @@ static void ip32_machine_restart(char *cmd)
unreachable(); unreachable();
} }
static void blink_timeout(unsigned long data) static void blink_timeout(struct timer_list *unused)
{ {
unsigned long led = mace->perif.ctrl.misc ^ MACEISA_LED_RED; unsigned long led = mace->perif.ctrl.misc ^ MACEISA_LED_RED;
mace->perif.ctrl.misc = led; mace->perif.ctrl.misc = led;
mod_timer(&blink_timer, jiffies + data); mod_timer(&blink_timer, jiffies + blink_timer_timeout);
} }
static void ip32_machine_halt(void) static void ip32_machine_halt(void)
@ -83,7 +84,7 @@ static void ip32_machine_halt(void)
ip32_poweroff(&ip32_rtc_device); ip32_poweroff(&ip32_rtc_device);
} }
static void power_timeout(unsigned long data) static void power_timeout(struct timer_list *unused)
{ {
ip32_poweroff(&ip32_rtc_device); ip32_poweroff(&ip32_rtc_device);
} }
@ -99,11 +100,10 @@ void ip32_prepare_poweroff(void)
} }
shutting_down = 1; shutting_down = 1;
blink_timer.data = POWERDOWN_FREQ; blink_timer_timeout = POWERDOWN_FREQ;
blink_timeout(POWERDOWN_FREQ); blink_timeout(&blink_timer);
init_timer(&power_timer); timer_setup(&power_timer, power_timeout, 0);
power_timer.function = power_timeout;
power_timer.expires = jiffies + POWERDOWN_TIMEOUT * HZ; power_timer.expires = jiffies + POWERDOWN_TIMEOUT * HZ;
add_timer(&power_timer); add_timer(&power_timer);
} }
@ -121,8 +121,8 @@ static int panic_event(struct notifier_block *this, unsigned long event,
led = mace->perif.ctrl.misc | MACEISA_LED_GREEN; led = mace->perif.ctrl.misc | MACEISA_LED_GREEN;
mace->perif.ctrl.misc = led; mace->perif.ctrl.misc = led;
blink_timer.data = PANIC_FREQ; blink_timer_timeout = PANIC_FREQ;
blink_timeout(PANIC_FREQ); blink_timeout(&blink_timer);
return NOTIFY_DONE; return NOTIFY_DONE;
} }
@ -143,8 +143,7 @@ static __init int ip32_reboot_setup(void)
_machine_halt = ip32_machine_halt; _machine_halt = ip32_machine_halt;
pm_power_off = ip32_machine_halt; pm_power_off = ip32_machine_halt;
init_timer(&blink_timer); timer_setup(&blink_timer, blink_timeout, 0);
blink_timer.function = blink_timeout;
atomic_notifier_chain_register(&panic_notifier_list, &panic_block); atomic_notifier_chain_register(&panic_notifier_list, &panic_block);
return 0; return 0;

View File

@ -92,7 +92,7 @@ static int pdc_console_setup(struct console *co, char *options)
#define PDC_CONS_POLL_DELAY (30 * HZ / 1000) #define PDC_CONS_POLL_DELAY (30 * HZ / 1000)
static void pdc_console_poll(unsigned long unused); static void pdc_console_poll(unsigned long unused);
static DEFINE_TIMER(pdc_console_timer, pdc_console_poll, 0, 0); static DEFINE_TIMER(pdc_console_timer, pdc_console_poll);
static struct tty_port tty_port; static struct tty_port tty_port;
static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp) static int pdc_console_tty_open(struct tty_struct *tty, struct file *filp)

View File

@ -262,9 +262,8 @@ static void wd_timer_reset(unsigned int cpu, struct timer_list *t)
add_timer_on(t, cpu); add_timer_on(t, cpu);
} }
static void wd_timer_fn(unsigned long data) static void wd_timer_fn(struct timer_list *t)
{ {
struct timer_list *t = this_cpu_ptr(&wd_timer);
int cpu = smp_processor_id(); int cpu = smp_processor_id();
watchdog_timer_interrupt(cpu); watchdog_timer_interrupt(cpu);
@ -288,7 +287,7 @@ static void start_watchdog_timer_on(unsigned int cpu)
per_cpu(wd_timer_tb, cpu) = get_tb(); per_cpu(wd_timer_tb, cpu) = get_tb();
setup_pinned_timer(t, wd_timer_fn, 0); timer_setup(t, wd_timer_fn, TIMER_PINNED);
wd_timer_reset(cpu, t); wd_timer_reset(cpu, t);
} }

View File

@ -1452,7 +1452,7 @@ static void topology_schedule_update(void)
schedule_work(&topology_work); schedule_work(&topology_work);
} }
static void topology_timer_fn(unsigned long ignored) static void topology_timer_fn(struct timer_list *unused)
{ {
if (prrn_enabled && cpumask_weight(&cpu_associativity_changes_mask)) if (prrn_enabled && cpumask_weight(&cpu_associativity_changes_mask))
topology_schedule_update(); topology_schedule_update();
@ -1462,14 +1462,11 @@ static void topology_timer_fn(unsigned long ignored)
reset_topology_timer(); reset_topology_timer();
} }
} }
static struct timer_list topology_timer = static struct timer_list topology_timer;
TIMER_INITIALIZER(topology_timer_fn, 0, 0);
static void reset_topology_timer(void) static void reset_topology_timer(void)
{ {
topology_timer.data = 0; mod_timer(&topology_timer, jiffies + 60 * HZ);
topology_timer.expires = jiffies + 60 * HZ;
mod_timer(&topology_timer, topology_timer.expires);
} }
#ifdef CONFIG_SMP #ifdef CONFIG_SMP
@ -1529,7 +1526,8 @@ int start_topology_update(void)
prrn_enabled = 0; prrn_enabled = 0;
vphn_enabled = 1; vphn_enabled = 1;
setup_cpu_associativity_change_counters(); setup_cpu_associativity_change_counters();
init_timer_deferrable(&topology_timer); timer_setup(&topology_timer, topology_timer_fn,
TIMER_DEFERRABLE);
reset_topology_timer(); reset_topology_timer();
} }
} }

View File

@ -153,14 +153,13 @@ static void lgr_timer_set(void);
/* /*
* LGR timer callback * LGR timer callback
*/ */
static void lgr_timer_fn(unsigned long ignored) static void lgr_timer_fn(struct timer_list *unused)
{ {
lgr_info_log(); lgr_info_log();
lgr_timer_set(); lgr_timer_set();
} }
static struct timer_list lgr_timer = static struct timer_list lgr_timer;
TIMER_DEFERRED_INITIALIZER(lgr_timer_fn, 0, 0);
/* /*
* Setup next LGR timer * Setup next LGR timer
@ -181,6 +180,7 @@ static int __init lgr_init(void)
debug_register_view(lgr_dbf, &debug_hex_ascii_view); debug_register_view(lgr_dbf, &debug_hex_ascii_view);
lgr_info_get(&lgr_info_last); lgr_info_get(&lgr_info_last);
debug_event(lgr_dbf, 1, &lgr_info_last, sizeof(lgr_info_last)); debug_event(lgr_dbf, 1, &lgr_info_last, sizeof(lgr_info_last));
timer_setup(&lgr_timer, lgr_timer_fn, TIMER_DEFERRABLE);
lgr_timer_set(); lgr_timer_set();
return 0; return 0;
} }

View File

@ -320,15 +320,14 @@ static void topology_flush_work(void)
flush_work(&topology_work); flush_work(&topology_work);
} }
static void topology_timer_fn(unsigned long ignored) static void topology_timer_fn(struct timer_list *unused)
{ {
if (ptf(PTF_CHECK)) if (ptf(PTF_CHECK))
topology_schedule_update(); topology_schedule_update();
set_topology_timer(); set_topology_timer();
} }
static struct timer_list topology_timer = static struct timer_list topology_timer;
TIMER_DEFERRED_INITIALIZER(topology_timer_fn, 0, 0);
static atomic_t topology_poll = ATOMIC_INIT(0); static atomic_t topology_poll = ATOMIC_INIT(0);
@ -597,6 +596,7 @@ static struct ctl_table topology_dir_table[] = {
static int __init topology_init(void) static int __init topology_init(void)
{ {
timer_setup(&topology_timer, topology_timer_fn, TIMER_DEFERRABLE);
if (MACHINE_HAS_TOPOLOGY) if (MACHINE_HAS_TOPOLOGY)
set_topology_timer(); set_topology_timer();
else else

View File

@ -56,7 +56,7 @@ static DEFINE_SPINLOCK(cmm_lock);
static struct task_struct *cmm_thread_ptr; static struct task_struct *cmm_thread_ptr;
static DECLARE_WAIT_QUEUE_HEAD(cmm_thread_wait); static DECLARE_WAIT_QUEUE_HEAD(cmm_thread_wait);
static DEFINE_TIMER(cmm_timer, NULL, 0, 0); static DEFINE_TIMER(cmm_timer, NULL);
static void cmm_timer_fn(unsigned long); static void cmm_timer_fn(unsigned long);
static void cmm_set_timer(void); static void cmm_set_timer(void);

View File

@ -31,19 +31,20 @@ static inline void led_toggle(void)
} }
static struct timer_list led_blink_timer; static struct timer_list led_blink_timer;
static unsigned long led_blink_timer_timeout;
static void led_blink(unsigned long timeout) static void led_blink(struct timer_list *unused)
{ {
unsigned long timeout = led_blink_timer_timeout;
led_toggle(); led_toggle();
/* reschedule */ /* reschedule */
if (!timeout) { /* blink according to load */ if (!timeout) { /* blink according to load */
led_blink_timer.expires = jiffies + led_blink_timer.expires = jiffies +
((1 + (avenrun[0] >> FSHIFT)) * HZ); ((1 + (avenrun[0] >> FSHIFT)) * HZ);
led_blink_timer.data = 0;
} else { /* blink at user specified interval */ } else { /* blink at user specified interval */
led_blink_timer.expires = jiffies + (timeout * HZ); led_blink_timer.expires = jiffies + (timeout * HZ);
led_blink_timer.data = timeout;
} }
add_timer(&led_blink_timer); add_timer(&led_blink_timer);
} }
@ -88,9 +89,11 @@ static ssize_t led_proc_write(struct file *file, const char __user *buffer,
} else if (!strcmp(buf, "toggle")) { } else if (!strcmp(buf, "toggle")) {
led_toggle(); led_toggle();
} else if ((*buf > '0') && (*buf <= '9')) { } else if ((*buf > '0') && (*buf <= '9')) {
led_blink(simple_strtoul(buf, NULL, 10)); led_blink_timer_timeout = simple_strtoul(buf, NULL, 10);
led_blink(&led_blink_timer);
} else if (!strcmp(buf, "load")) { } else if (!strcmp(buf, "load")) {
led_blink(0); led_blink_timer_timeout = 0;
led_blink(&led_blink_timer);
} else { } else {
auxio_set_led(AUXIO_LED_OFF); auxio_set_led(AUXIO_LED_OFF);
} }
@ -115,8 +118,7 @@ static struct proc_dir_entry *led;
static int __init led_init(void) static int __init led_init(void)
{ {
init_timer(&led_blink_timer); timer_setup(&led_blink_timer, led_blink, 0);
led_blink_timer.function = led_blink;
led = proc_create("led", 0, NULL, &led_proc_fops); led = proc_create("led", 0, NULL, &led_proc_fops);
if (!led) if (!led)

View File

@ -898,10 +898,9 @@ static void calioc2_dump_error_regs(struct iommu_table *tbl)
PHB_ROOT_COMPLEX_STATUS); PHB_ROOT_COMPLEX_STATUS);
} }
static void calgary_watchdog(unsigned long data) static void calgary_watchdog(struct timer_list *t)
{ {
struct pci_dev *dev = (struct pci_dev *)data; struct iommu_table *tbl = from_timer(tbl, t, watchdog_timer);
struct iommu_table *tbl = pci_iommu(dev->bus);
void __iomem *bbar = tbl->bbar; void __iomem *bbar = tbl->bbar;
u32 val32; u32 val32;
void __iomem *target; void __iomem *target;
@ -1016,8 +1015,7 @@ static void __init calgary_enable_translation(struct pci_dev *dev)
writel(cpu_to_be32(val32), target); writel(cpu_to_be32(val32), target);
readl(target); /* flush */ readl(target); /* flush */
setup_timer(&tbl->watchdog_timer, &calgary_watchdog, timer_setup(&tbl->watchdog_timer, calgary_watchdog, 0);
(unsigned long)dev);
mod_timer(&tbl->watchdog_timer, jiffies); mod_timer(&tbl->watchdog_timer, jiffies);
} }

View File

@ -47,15 +47,14 @@ static char *serial_name = "ISS serial driver";
* initialization for the tty structure. * initialization for the tty structure.
*/ */
static void rs_poll(unsigned long); static void rs_poll(struct timer_list *);
static int rs_open(struct tty_struct *tty, struct file * filp) static int rs_open(struct tty_struct *tty, struct file * filp)
{ {
tty->port = &serial_port; tty->port = &serial_port;
spin_lock_bh(&timer_lock); spin_lock_bh(&timer_lock);
if (tty->count == 1) { if (tty->count == 1) {
setup_timer(&serial_timer, rs_poll, timer_setup(&serial_timer, rs_poll, 0);
(unsigned long)&serial_port);
mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE); mod_timer(&serial_timer, jiffies + SERIAL_TIMER_VALUE);
} }
spin_unlock_bh(&timer_lock); spin_unlock_bh(&timer_lock);
@ -92,9 +91,9 @@ static int rs_write(struct tty_struct * tty,
return count; return count;
} }
static void rs_poll(unsigned long priv) static void rs_poll(struct timer_list *unused)
{ {
struct tty_port *port = (struct tty_port *)priv; struct tty_port *port = &serial_port;
int i = 0; int i = 0;
int rd = 1; int rd = 1;
unsigned char c; unsigned char c;

View File

@ -349,9 +349,9 @@ static int iss_net_poll(void)
} }
static void iss_net_timer(unsigned long priv) static void iss_net_timer(struct timer_list *t)
{ {
struct iss_net_private *lp = (struct iss_net_private *)priv; struct iss_net_private *lp = from_timer(lp, t, timer);
iss_net_poll(); iss_net_poll();
spin_lock(&lp->lock); spin_lock(&lp->lock);
@ -386,10 +386,8 @@ static int iss_net_open(struct net_device *dev)
spin_unlock_bh(&opened_lock); spin_unlock_bh(&opened_lock);
spin_lock_bh(&lp->lock); spin_lock_bh(&lp->lock);
init_timer(&lp->timer); timer_setup(&lp->timer, iss_net_timer, 0);
lp->timer_val = ISS_NET_TIMER_VALUE; lp->timer_val = ISS_NET_TIMER_VALUE;
lp->timer.data = (unsigned long) lp;
lp->timer.function = iss_net_timer;
mod_timer(&lp->timer, jiffies + lp->timer_val); mod_timer(&lp->timer, jiffies + lp->timer_val);
out: out:
@ -482,7 +480,7 @@ static int iss_net_change_mtu(struct net_device *dev, int new_mtu)
return -EINVAL; return -EINVAL;
} }
void iss_net_user_timer_expire(unsigned long _conn) void iss_net_user_timer_expire(struct timer_list *unused)
{ {
} }
@ -582,8 +580,7 @@ static int iss_net_configure(int index, char *init)
return 1; return 1;
} }
init_timer(&lp->tl); timer_setup(&lp->tl, iss_net_user_timer_expire, 0);
lp->tl.function = iss_net_user_timer_expire;
return 0; return 0;

View File

@ -774,9 +774,9 @@ static void ghes_add_timer(struct ghes *ghes)
add_timer(&ghes->timer); add_timer(&ghes->timer);
} }
static void ghes_poll_func(unsigned long data) static void ghes_poll_func(struct timer_list *t)
{ {
struct ghes *ghes = (void *)data; struct ghes *ghes = from_timer(ghes, t, timer);
ghes_proc(ghes); ghes_proc(ghes);
if (!(ghes->flags & GHES_EXITING)) if (!(ghes->flags & GHES_EXITING))
@ -1147,8 +1147,7 @@ static int ghes_probe(struct platform_device *ghes_dev)
switch (generic->notify.type) { switch (generic->notify.type) {
case ACPI_HEST_NOTIFY_POLLED: case ACPI_HEST_NOTIFY_POLLED:
setup_deferrable_timer(&ghes->timer, ghes_poll_func, timer_setup(&ghes->timer, ghes_poll_func, TIMER_DEFERRABLE);
(unsigned long)ghes);
ghes_add_timer(ghes); ghes_add_timer(ghes);
break; break;
case ACPI_HEST_NOTIFY_EXTERNAL: case ACPI_HEST_NOTIFY_EXTERNAL:

View File

@ -303,6 +303,7 @@ struct ahci_em_priv {
unsigned long saved_activity; unsigned long saved_activity;
unsigned long activity; unsigned long activity;
unsigned long led_state; unsigned long led_state;
struct ata_link *link;
}; };
struct ahci_port_priv { struct ahci_port_priv {

View File

@ -968,12 +968,12 @@ static void ahci_sw_activity(struct ata_link *link)
mod_timer(&emp->timer, jiffies + msecs_to_jiffies(10)); mod_timer(&emp->timer, jiffies + msecs_to_jiffies(10));
} }
static void ahci_sw_activity_blink(unsigned long arg) static void ahci_sw_activity_blink(struct timer_list *t)
{ {
struct ata_link *link = (struct ata_link *)arg; struct ahci_em_priv *emp = from_timer(emp, t, timer);
struct ata_link *link = emp->link;
struct ata_port *ap = link->ap; struct ata_port *ap = link->ap;
struct ahci_port_priv *pp = ap->private_data;
struct ahci_em_priv *emp = &pp->em_priv[link->pmp];
unsigned long led_message = emp->led_state; unsigned long led_message = emp->led_state;
u32 activity_led_state; u32 activity_led_state;
unsigned long flags; unsigned long flags;
@ -1020,7 +1020,8 @@ static void ahci_init_sw_activity(struct ata_link *link)
/* init activity stats, setup timer */ /* init activity stats, setup timer */
emp->saved_activity = emp->activity = 0; emp->saved_activity = emp->activity = 0;
setup_timer(&emp->timer, ahci_sw_activity_blink, (unsigned long)link); emp->link = link;
timer_setup(&emp->timer, ahci_sw_activity_blink, 0);
/* check our blink policy and set flag for link if it's enabled */ /* check our blink policy and set flag for link if it's enabled */
if (emp->blink_policy) if (emp->blink_policy)

View File

@ -5979,9 +5979,8 @@ struct ata_port *ata_port_alloc(struct ata_host *host)
INIT_LIST_HEAD(&ap->eh_done_q); INIT_LIST_HEAD(&ap->eh_done_q);
init_waitqueue_head(&ap->eh_wait_q); init_waitqueue_head(&ap->eh_wait_q);
init_completion(&ap->park_req_pending); init_completion(&ap->park_req_pending);
setup_deferrable_timer(&ap->fastdrain_timer, timer_setup(&ap->fastdrain_timer, ata_eh_fastdrain_timerfn,
ata_eh_fastdrain_timerfn, TIMER_DEFERRABLE);
(unsigned long)ap);
ap->cbl = ATA_CBL_NONE; ap->cbl = ATA_CBL_NONE;

View File

@ -879,9 +879,9 @@ static int ata_eh_nr_in_flight(struct ata_port *ap)
return nr; return nr;
} }
void ata_eh_fastdrain_timerfn(unsigned long arg) void ata_eh_fastdrain_timerfn(struct timer_list *t)
{ {
struct ata_port *ap = (void *)arg; struct ata_port *ap = from_timer(ap, t, fastdrain_timer);
unsigned long flags; unsigned long flags;
int cnt; int cnt;

View File

@ -154,7 +154,7 @@ extern void ata_internal_cmd_timed_out(struct ata_device *dev, u8 cmd);
extern void ata_eh_acquire(struct ata_port *ap); extern void ata_eh_acquire(struct ata_port *ap);
extern void ata_eh_release(struct ata_port *ap); extern void ata_eh_release(struct ata_port *ap);
extern void ata_scsi_error(struct Scsi_Host *host); extern void ata_scsi_error(struct Scsi_Host *host);
extern void ata_eh_fastdrain_timerfn(unsigned long arg); extern void ata_eh_fastdrain_timerfn(struct timer_list *t);
extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc); extern void ata_qc_schedule_eh(struct ata_queued_cmd *qc);
extern void ata_dev_disable(struct ata_device *dev); extern void ata_dev_disable(struct ata_device *dev);
extern void ata_eh_detach_dev(struct ata_device *dev); extern void ata_eh_detach_dev(struct ata_device *dev);

View File

@ -49,8 +49,8 @@ static void idt77105_stats_timer_func(unsigned long);
static void idt77105_restart_timer_func(unsigned long); static void idt77105_restart_timer_func(unsigned long);
static DEFINE_TIMER(stats_timer, idt77105_stats_timer_func, 0, 0); static DEFINE_TIMER(stats_timer, idt77105_stats_timer_func);
static DEFINE_TIMER(restart_timer, idt77105_restart_timer_func, 0, 0); static DEFINE_TIMER(restart_timer, idt77105_restart_timer_func);
static int start_timer = 1; static int start_timer = 1;
static struct idt77105_priv *idt77105_all = NULL; static struct idt77105_priv *idt77105_all = NULL;

View File

@ -76,7 +76,7 @@ static IADEV *ia_dev[8];
static struct atm_dev *_ia_dev[8]; static struct atm_dev *_ia_dev[8];
static int iadev_count; static int iadev_count;
static void ia_led_timer(unsigned long arg); static void ia_led_timer(unsigned long arg);
static DEFINE_TIMER(ia_timer, ia_led_timer, 0, 0); static DEFINE_TIMER(ia_timer, ia_led_timer);
static int IA_TX_BUF = DFL_TX_BUFFERS, IA_TX_BUF_SZ = DFL_TX_BUF_SZ; static int IA_TX_BUF = DFL_TX_BUFFERS, IA_TX_BUF_SZ = DFL_TX_BUF_SZ;
static int IA_RX_BUF = DFL_RX_BUFFERS, IA_RX_BUF_SZ = DFL_RX_BUF_SZ; static int IA_RX_BUF = DFL_RX_BUFFERS, IA_RX_BUF_SZ = DFL_RX_BUF_SZ;
static uint IADebugFlag = /* IF_IADBG_ERR | IF_IADBG_CBR| IF_IADBG_INIT_ADAPTER static uint IADebugFlag = /* IF_IADBG_ERR | IF_IADBG_CBR| IF_IADBG_INIT_ADAPTER

View File

@ -229,9 +229,9 @@ MODULE_DEVICE_TABLE(of, img_ascii_lcd_matches);
* Scroll the current message along the LCD by one character, rearming the * Scroll the current message along the LCD by one character, rearming the
* timer if required. * timer if required.
*/ */
static void img_ascii_lcd_scroll(unsigned long arg) static void img_ascii_lcd_scroll(struct timer_list *t)
{ {
struct img_ascii_lcd_ctx *ctx = (struct img_ascii_lcd_ctx *)arg; struct img_ascii_lcd_ctx *ctx = from_timer(ctx, t, timer);
unsigned int i, ch = ctx->scroll_pos; unsigned int i, ch = ctx->scroll_pos;
unsigned int num_chars = ctx->cfg->num_chars; unsigned int num_chars = ctx->cfg->num_chars;
@ -299,7 +299,7 @@ static int img_ascii_lcd_display(struct img_ascii_lcd_ctx *ctx,
ctx->scroll_pos = 0; ctx->scroll_pos = 0;
/* update the LCD */ /* update the LCD */
img_ascii_lcd_scroll((unsigned long)ctx); img_ascii_lcd_scroll(&ctx->timer);
return 0; return 0;
} }
@ -395,9 +395,7 @@ static int img_ascii_lcd_probe(struct platform_device *pdev)
ctx->scroll_rate = HZ / 2; ctx->scroll_rate = HZ / 2;
/* initialise a timer for scrolling the message */ /* initialise a timer for scrolling the message */
init_timer(&ctx->timer); timer_setup(&ctx->timer, img_ascii_lcd_scroll, 0);
ctx->timer.function = img_ascii_lcd_scroll;
ctx->timer.data = (unsigned long)ctx;
platform_set_drvdata(pdev, ctx); platform_set_drvdata(pdev, ctx);

View File

@ -1396,7 +1396,7 @@ static void panel_process_inputs(void)
} }
} }
static void panel_scan_timer(void) static void panel_scan_timer(struct timer_list *unused)
{ {
if (keypad.enabled && keypad_initialized) { if (keypad.enabled && keypad_initialized) {
if (spin_trylock_irq(&pprt_lock)) { if (spin_trylock_irq(&pprt_lock)) {
@ -1421,7 +1421,7 @@ static void init_scan_timer(void)
if (scan_timer.function) if (scan_timer.function)
return; /* already started */ return; /* already started */
setup_timer(&scan_timer, (void *)&panel_scan_timer, 0); timer_setup(&scan_timer, panel_scan_timer, 0);
scan_timer.expires = jiffies + INPUT_POLL_TIME; scan_timer.expires = jiffies + INPUT_POLL_TIME;
add_timer(&scan_timer); add_timer(&scan_timer);
} }

View File

@ -478,9 +478,9 @@ struct dpm_watchdog {
* There's not much we can do here to recover so panic() to * There's not much we can do here to recover so panic() to
* capture a crash-dump in pstore. * capture a crash-dump in pstore.
*/ */
static void dpm_watchdog_handler(unsigned long data) static void dpm_watchdog_handler(struct timer_list *t)
{ {
struct dpm_watchdog *wd = (void *)data; struct dpm_watchdog *wd = from_timer(wd, t, timer);
dev_emerg(wd->dev, "**** DPM device timeout ****\n"); dev_emerg(wd->dev, "**** DPM device timeout ****\n");
show_stack(wd->tsk, NULL); show_stack(wd->tsk, NULL);
@ -500,11 +500,9 @@ static void dpm_watchdog_set(struct dpm_watchdog *wd, struct device *dev)
wd->dev = dev; wd->dev = dev;
wd->tsk = current; wd->tsk = current;
init_timer_on_stack(timer); timer_setup_on_stack(timer, dpm_watchdog_handler, 0);
/* use same timeout value for both suspend and resume */ /* use same timeout value for both suspend and resume */
timer->expires = jiffies + HZ * CONFIG_DPM_WATCHDOG_TIMEOUT; timer->expires = jiffies + HZ * CONFIG_DPM_WATCHDOG_TIMEOUT;
timer->function = dpm_watchdog_handler;
timer->data = (unsigned long)wd;
add_timer(timer); add_timer(timer);
} }

View File

@ -323,7 +323,7 @@ static void fd_deselect (int drive)
} }
static void motor_on_callback(unsigned long nr) static void motor_on_callback(unsigned long ignored)
{ {
if (!(ciaa.pra & DSKRDY) || --on_attempts == 0) { if (!(ciaa.pra & DSKRDY) || --on_attempts == 0) {
complete_all(&motor_on_completion); complete_all(&motor_on_completion);
@ -344,7 +344,6 @@ static int fd_motor_on(int nr)
fd_select(nr); fd_select(nr);
reinit_completion(&motor_on_completion); reinit_completion(&motor_on_completion);
motor_on_timer.data = nr;
mod_timer(&motor_on_timer, jiffies + HZ/2); mod_timer(&motor_on_timer, jiffies + HZ/2);
on_attempts = 10; on_attempts = 10;

View File

@ -15,49 +15,19 @@ MODULE_AUTHOR("Sam Hopkins <sah@coraid.com>");
MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels"); MODULE_DESCRIPTION("AoE block/char driver for 2.6.2 and newer 2.6 kernels");
MODULE_VERSION(VERSION); MODULE_VERSION(VERSION);
enum { TINIT, TRUN, TKILL }; static struct timer_list timer;
static void static void discover_timer(struct timer_list *t)
discover_timer(ulong vp)
{ {
static struct timer_list t; mod_timer(t, jiffies + HZ * 60); /* one minute */
static volatile ulong die;
static spinlock_t lock;
ulong flags;
enum { DTIMERTICK = HZ * 60 }; /* one minute */
switch (vp) {
case TINIT:
init_timer(&t);
spin_lock_init(&lock);
t.data = TRUN;
t.function = discover_timer;
die = 0;
case TRUN:
spin_lock_irqsave(&lock, flags);
if (!die) {
t.expires = jiffies + DTIMERTICK;
add_timer(&t);
}
spin_unlock_irqrestore(&lock, flags);
aoecmd_cfg(0xffff, 0xff); aoecmd_cfg(0xffff, 0xff);
return;
case TKILL:
spin_lock_irqsave(&lock, flags);
die = 1;
spin_unlock_irqrestore(&lock, flags);
del_timer_sync(&t);
default:
return;
}
} }
static void static void
aoe_exit(void) aoe_exit(void)
{ {
discover_timer(TKILL); del_timer_sync(&timer);
aoenet_exit(); aoenet_exit();
unregister_blkdev(AOE_MAJOR, DEVICE_NAME); unregister_blkdev(AOE_MAJOR, DEVICE_NAME);
@ -93,7 +63,9 @@ aoe_init(void)
goto blkreg_fail; goto blkreg_fail;
} }
printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION); printk(KERN_INFO "aoe: AoE v%s initialised.\n", VERSION);
discover_timer(TINIT);
timer_setup(&timer, discover_timer, 0);
discover_timer(&timer);
return 0; return 0;
blkreg_fail: blkreg_fail:
aoecmd_exit(); aoecmd_exit();

View File

@ -373,10 +373,10 @@ static void floppy_release(struct gendisk *disk, fmode_t mode);
/************************* End of Prototypes **************************/ /************************* End of Prototypes **************************/
static DEFINE_TIMER(motor_off_timer, fd_motor_off_timer, 0, 0); static DEFINE_TIMER(motor_off_timer, fd_motor_off_timer);
static DEFINE_TIMER(readtrack_timer, fd_readtrack_check, 0, 0); static DEFINE_TIMER(readtrack_timer, fd_readtrack_check);
static DEFINE_TIMER(timeout_timer, fd_times_out, 0, 0); static DEFINE_TIMER(timeout_timer, fd_times_out);
static DEFINE_TIMER(fd_timer, check_change, 0, 0); static DEFINE_TIMER(fd_timer, check_change);
static void fd_end_request_cur(blk_status_t err) static void fd_end_request_cur(blk_status_t err)
{ {

View File

@ -1551,8 +1551,8 @@ extern int w_restart_disk_io(struct drbd_work *, int);
extern int w_send_out_of_sync(struct drbd_work *, int); extern int w_send_out_of_sync(struct drbd_work *, int);
extern int w_start_resync(struct drbd_work *, int); extern int w_start_resync(struct drbd_work *, int);
extern void resync_timer_fn(unsigned long data); extern void resync_timer_fn(struct timer_list *t);
extern void start_resync_timer_fn(unsigned long data); extern void start_resync_timer_fn(struct timer_list *t);
extern void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req); extern void drbd_endio_write_sec_final(struct drbd_peer_request *peer_req);

View File

@ -64,7 +64,7 @@
static DEFINE_MUTEX(drbd_main_mutex); static DEFINE_MUTEX(drbd_main_mutex);
static int drbd_open(struct block_device *bdev, fmode_t mode); static int drbd_open(struct block_device *bdev, fmode_t mode);
static void drbd_release(struct gendisk *gd, fmode_t mode); static void drbd_release(struct gendisk *gd, fmode_t mode);
static void md_sync_timer_fn(unsigned long data); static void md_sync_timer_fn(struct timer_list *t);
static int w_bitmap_io(struct drbd_work *w, int unused); static int w_bitmap_io(struct drbd_work *w, int unused);
MODULE_AUTHOR("Philipp Reisner <phil@linbit.com>, " MODULE_AUTHOR("Philipp Reisner <phil@linbit.com>, "
@ -2023,14 +2023,10 @@ void drbd_init_set_defaults(struct drbd_device *device)
device->unplug_work.cb = w_send_write_hint; device->unplug_work.cb = w_send_write_hint;
device->bm_io_work.w.cb = w_bitmap_io; device->bm_io_work.w.cb = w_bitmap_io;
setup_timer(&device->resync_timer, resync_timer_fn, timer_setup(&device->resync_timer, resync_timer_fn, 0);
(unsigned long)device); timer_setup(&device->md_sync_timer, md_sync_timer_fn, 0);
setup_timer(&device->md_sync_timer, md_sync_timer_fn, timer_setup(&device->start_resync_timer, start_resync_timer_fn, 0);
(unsigned long)device); timer_setup(&device->request_timer, request_timer_fn, 0);
setup_timer(&device->start_resync_timer, start_resync_timer_fn,
(unsigned long)device);
setup_timer(&device->request_timer, request_timer_fn,
(unsigned long)device);
init_waitqueue_head(&device->misc_wait); init_waitqueue_head(&device->misc_wait);
init_waitqueue_head(&device->state_wait); init_waitqueue_head(&device->state_wait);
@ -3721,9 +3717,9 @@ int drbd_md_test_flag(struct drbd_backing_dev *bdev, int flag)
return (bdev->md.flags & flag) != 0; return (bdev->md.flags & flag) != 0;
} }
static void md_sync_timer_fn(unsigned long data) static void md_sync_timer_fn(struct timer_list *t)
{ {
struct drbd_device *device = (struct drbd_device *) data; struct drbd_device *device = from_timer(device, t, md_sync_timer);
drbd_device_post_work(device, MD_SYNC); drbd_device_post_work(device, MD_SYNC);
} }

View File

@ -5056,7 +5056,7 @@ static int drbd_disconnected(struct drbd_peer_device *peer_device)
wake_up(&device->misc_wait); wake_up(&device->misc_wait);
del_timer_sync(&device->resync_timer); del_timer_sync(&device->resync_timer);
resync_timer_fn((unsigned long)device); resync_timer_fn(&device->resync_timer);
/* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier, /* wait for all w_e_end_data_req, w_e_end_rsdata_req, w_send_barrier,
* w_make_resync_request etc. which may still be on the worker queue * w_make_resync_request etc. which may still be on the worker queue

View File

@ -1714,9 +1714,9 @@ static bool net_timeout_reached(struct drbd_request *net_req,
* to expire twice (worst case) to become effective. Good enough. * to expire twice (worst case) to become effective. Good enough.
*/ */
void request_timer_fn(unsigned long data) void request_timer_fn(struct timer_list *t)
{ {
struct drbd_device *device = (struct drbd_device *) data; struct drbd_device *device = from_timer(device, t, request_timer);
struct drbd_connection *connection = first_peer_device(device)->connection; struct drbd_connection *connection = first_peer_device(device)->connection;
struct drbd_request *req_read, *req_write, *req_peer; /* oldest request */ struct drbd_request *req_read, *req_write, *req_peer; /* oldest request */
struct net_conf *nc; struct net_conf *nc;

View File

@ -294,7 +294,7 @@ extern int __req_mod(struct drbd_request *req, enum drbd_req_event what,
struct bio_and_error *m); struct bio_and_error *m);
extern void complete_master_bio(struct drbd_device *device, extern void complete_master_bio(struct drbd_device *device,
struct bio_and_error *m); struct bio_and_error *m);
extern void request_timer_fn(unsigned long data); extern void request_timer_fn(struct timer_list *t);
extern void tl_restart(struct drbd_connection *connection, enum drbd_req_event what); extern void tl_restart(struct drbd_connection *connection, enum drbd_req_event what);
extern void _tl_restart(struct drbd_connection *connection, enum drbd_req_event what); extern void _tl_restart(struct drbd_connection *connection, enum drbd_req_event what);
extern void tl_abort_disk_io(struct drbd_device *device); extern void tl_abort_disk_io(struct drbd_device *device);

View File

@ -457,9 +457,9 @@ int w_resync_timer(struct drbd_work *w, int cancel)
return 0; return 0;
} }
void resync_timer_fn(unsigned long data) void resync_timer_fn(struct timer_list *t)
{ {
struct drbd_device *device = (struct drbd_device *) data; struct drbd_device *device = from_timer(device, t, resync_timer);
drbd_queue_work_if_unqueued( drbd_queue_work_if_unqueued(
&first_peer_device(device)->connection->sender_work, &first_peer_device(device)->connection->sender_work,
@ -1705,9 +1705,9 @@ void drbd_rs_controller_reset(struct drbd_device *device)
rcu_read_unlock(); rcu_read_unlock();
} }
void start_resync_timer_fn(unsigned long data) void start_resync_timer_fn(struct timer_list *t)
{ {
struct drbd_device *device = (struct drbd_device *) data; struct drbd_device *device = from_timer(device, t, start_resync_timer);
drbd_device_post_work(device, RS_START); drbd_device_post_work(device, RS_START);
} }

View File

@ -84,7 +84,7 @@ static int dtlk_has_indexing;
static unsigned int dtlk_portlist[] = static unsigned int dtlk_portlist[] =
{0x25e, 0x29e, 0x2de, 0x31e, 0x35e, 0x39e, 0}; {0x25e, 0x29e, 0x2de, 0x31e, 0x35e, 0x39e, 0};
static wait_queue_head_t dtlk_process_list; static wait_queue_head_t dtlk_process_list;
static DEFINE_TIMER(dtlk_timer, dtlk_timer_tick, 0, 0); static DEFINE_TIMER(dtlk_timer, dtlk_timer_tick);
/* prototypes for file_operations struct */ /* prototypes for file_operations struct */
static ssize_t dtlk_read(struct file *, char __user *, static ssize_t dtlk_read(struct file *, char __user *,

View File

@ -124,7 +124,7 @@ static unsigned long long hangcheck_tsc, hangcheck_tsc_margin;
static void hangcheck_fire(unsigned long); static void hangcheck_fire(unsigned long);
static DEFINE_TIMER(hangcheck_ticktock, hangcheck_fire, 0, 0); static DEFINE_TIMER(hangcheck_ticktock, hangcheck_fire);
static void hangcheck_fire(unsigned long data) static void hangcheck_fire(unsigned long data)
{ {

View File

@ -100,9 +100,9 @@ struct xgene_rng_dev {
struct clk *clk; struct clk *clk;
}; };
static void xgene_rng_expired_timer(unsigned long arg) static void xgene_rng_expired_timer(struct timer_list *t)
{ {
struct xgene_rng_dev *ctx = (struct xgene_rng_dev *) arg; struct xgene_rng_dev *ctx = from_timer(ctx, t, failure_timer);
/* Clear failure counter as timer expired */ /* Clear failure counter as timer expired */
disable_irq(ctx->irq); disable_irq(ctx->irq);
@ -113,8 +113,6 @@ static void xgene_rng_expired_timer(unsigned long arg)
static void xgene_rng_start_timer(struct xgene_rng_dev *ctx) static void xgene_rng_start_timer(struct xgene_rng_dev *ctx)
{ {
ctx->failure_timer.data = (unsigned long) ctx;
ctx->failure_timer.function = xgene_rng_expired_timer;
ctx->failure_timer.expires = jiffies + 120 * HZ; ctx->failure_timer.expires = jiffies + 120 * HZ;
add_timer(&ctx->failure_timer); add_timer(&ctx->failure_timer);
} }
@ -292,7 +290,7 @@ static int xgene_rng_init(struct hwrng *rng)
struct xgene_rng_dev *ctx = (struct xgene_rng_dev *) rng->priv; struct xgene_rng_dev *ctx = (struct xgene_rng_dev *) rng->priv;
ctx->failure_cnt = 0; ctx->failure_cnt = 0;
init_timer(&ctx->failure_timer); timer_setup(&ctx->failure_timer, xgene_rng_expired_timer, 0);
ctx->revision = readl(ctx->csr_base + RNG_EIP_REV); ctx->revision = readl(ctx->csr_base + RNG_EIP_REV);

View File

@ -27,7 +27,7 @@ static void button_sequence_finished (unsigned long parameters);
static int button_press_count; /* The count of button presses */ static int button_press_count; /* The count of button presses */
/* Times for the end of a sequence */ /* Times for the end of a sequence */
static DEFINE_TIMER(button_timer, button_sequence_finished, 0, 0); static DEFINE_TIMER(button_timer, button_sequence_finished);
static DECLARE_WAIT_QUEUE_HEAD(button_wait_queue); /* Used for blocking read */ static DECLARE_WAIT_QUEUE_HEAD(button_wait_queue); /* Used for blocking read */
static char button_output_buffer[32]; /* Stores data to write out of device */ static char button_output_buffer[32]; /* Stores data to write out of device */
static int bcount; /* The number of bytes in the buffer */ static int bcount; /* The number of bytes in the buffer */

View File

@ -137,7 +137,7 @@ static DECLARE_WAIT_QUEUE_HEAD(rtc_wait);
#ifdef RTC_IRQ #ifdef RTC_IRQ
static void rtc_dropped_irq(unsigned long data); static void rtc_dropped_irq(unsigned long data);
static DEFINE_TIMER(rtc_irq_timer, rtc_dropped_irq, 0, 0); static DEFINE_TIMER(rtc_irq_timer, rtc_dropped_irq);
#endif #endif
static ssize_t rtc_read(struct file *file, char __user *buf, static ssize_t rtc_read(struct file *file, char __user *buf,

View File

@ -184,9 +184,8 @@ static unsigned int telclk_interrupt;
static int int_events; /* Event that generate a interrupt */ static int int_events; /* Event that generate a interrupt */
static int got_event; /* if events processing have been done */ static int got_event; /* if events processing have been done */
static void switchover_timeout(unsigned long data); static void switchover_timeout(struct timer_list *t);
static struct timer_list switchover_timer = static struct timer_list switchover_timer;
TIMER_INITIALIZER(switchover_timeout , 0, 0);
static unsigned long tlclk_timer_data; static unsigned long tlclk_timer_data;
static struct tlclk_alarms *alarm_events; static struct tlclk_alarms *alarm_events;
@ -805,7 +804,7 @@ static int __init tlclk_init(void)
goto out3; goto out3;
} }
init_timer(&switchover_timer); timer_setup(&switchover_timer, switchover_timeout, 0);
ret = misc_register(&tlclk_miscdev); ret = misc_register(&tlclk_miscdev);
if (ret < 0) { if (ret < 0) {
@ -855,9 +854,9 @@ static void __exit tlclk_cleanup(void)
} }
static void switchover_timeout(unsigned long data) static void switchover_timeout(struct timer_list *unused)
{ {
unsigned long flags = *(unsigned long *) data; unsigned long flags = tlclk_timer_data;
if ((flags & 1)) { if ((flags & 1)) {
if ((inb(TLCLK_REG1) & 0x08) != (flags & 0x08)) if ((inb(TLCLK_REG1) & 0x08) != (flags & 0x08))
@ -922,7 +921,6 @@ static irqreturn_t tlclk_interrupt(int irq, void *dev_id)
/* TIMEOUT in ~10ms */ /* TIMEOUT in ~10ms */
switchover_timer.expires = jiffies + msecs_to_jiffies(10); switchover_timer.expires = jiffies + msecs_to_jiffies(10);
tlclk_timer_data = inb(TLCLK_REG1); tlclk_timer_data = inb(TLCLK_REG1);
switchover_timer.data = (unsigned long) &tlclk_timer_data;
mod_timer(&switchover_timer, switchover_timer.expires); mod_timer(&switchover_timer, switchover_timer.expires);
} else { } else {
got_event = 1; got_event = 1;

View File

@ -1,9 +1,8 @@
menu "Clock Source drivers" menu "Clock Source drivers"
depends on !ARCH_USES_GETTIMEOFFSET depends on GENERIC_CLOCKEVENTS
config TIMER_OF config TIMER_OF
bool bool
depends on GENERIC_CLOCKEVENTS
select TIMER_PROBE select TIMER_PROBE
config TIMER_ACPI config TIMER_ACPI
@ -30,21 +29,18 @@ config CLKSRC_MMIO
config BCM2835_TIMER config BCM2835_TIMER
bool "BCM2835 timer driver" if COMPILE_TEST bool "BCM2835 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables the support for the BCM2835 timer driver. Enables the support for the BCM2835 timer driver.
config BCM_KONA_TIMER config BCM_KONA_TIMER
bool "BCM mobile timer driver" if COMPILE_TEST bool "BCM mobile timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables the support for the BCM Kona mobile timer driver. Enables the support for the BCM Kona mobile timer driver.
config DIGICOLOR_TIMER config DIGICOLOR_TIMER
bool "Digicolor timer driver" if COMPILE_TEST bool "Digicolor timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
depends on HAS_IOMEM depends on HAS_IOMEM
help help
@ -52,7 +48,6 @@ config DIGICOLOR_TIMER
config DW_APB_TIMER config DW_APB_TIMER
bool "DW APB timer driver" if COMPILE_TEST bool "DW APB timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
help help
Enables the support for the dw_apb timer. Enables the support for the dw_apb timer.
@ -63,7 +58,6 @@ config DW_APB_TIMER_OF
config FTTMR010_TIMER config FTTMR010_TIMER
bool "Faraday Technology timer driver" if COMPILE_TEST bool "Faraday Technology timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
select CLKSRC_MMIO select CLKSRC_MMIO
select TIMER_OF select TIMER_OF
@ -90,7 +84,6 @@ config ARMADA_370_XP_TIMER
config MESON6_TIMER config MESON6_TIMER
bool "Meson6 timer driver" if COMPILE_TEST bool "Meson6 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables the support for the Meson6 timer driver. Enables the support for the Meson6 timer driver.
@ -105,14 +98,12 @@ config ORION_TIMER
config OWL_TIMER config OWL_TIMER
bool "Owl timer driver" if COMPILE_TEST bool "Owl timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables the support for the Actions Semi Owl timer driver. Enables the support for the Actions Semi Owl timer driver.
config SUN4I_TIMER config SUN4I_TIMER
bool "Sun4i timer driver" if COMPILE_TEST bool "Sun4i timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
select CLKSRC_MMIO select CLKSRC_MMIO
select TIMER_OF select TIMER_OF
@ -135,7 +126,6 @@ config TEGRA_TIMER
config VT8500_TIMER config VT8500_TIMER
bool "VT8500 timer driver" if COMPILE_TEST bool "VT8500 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
help help
Enables support for the VT8500 driver. Enables support for the VT8500 driver.
@ -148,7 +138,6 @@ config CADENCE_TTC_TIMER
config ASM9260_TIMER config ASM9260_TIMER
bool "ASM9260 timer driver" if COMPILE_TEST bool "ASM9260 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
select TIMER_OF select TIMER_OF
help help
@ -171,28 +160,24 @@ config CLKSRC_NOMADIK_MTU_SCHED_CLOCK
config CLKSRC_DBX500_PRCMU config CLKSRC_DBX500_PRCMU
bool "Clocksource PRCMU Timer" if COMPILE_TEST bool "Clocksource PRCMU Timer" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
help help
Use the always on PRCMU Timer as clocksource Use the always on PRCMU Timer as clocksource
config CLPS711X_TIMER config CLPS711X_TIMER
bool "Cirrus logic timer driver" if COMPILE_TEST bool "Cirrus logic timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables support for the Cirrus Logic PS711 timer. Enables support for the Cirrus Logic PS711 timer.
config ATLAS7_TIMER config ATLAS7_TIMER
bool "Atlas7 timer driver" if COMPILE_TEST bool "Atlas7 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables support for the Atlas7 timer. Enables support for the Atlas7 timer.
config MXS_TIMER config MXS_TIMER
bool "Mxs timer driver" if COMPILE_TEST bool "Mxs timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
select STMP_DEVICE select STMP_DEVICE
help help
@ -200,14 +185,12 @@ config MXS_TIMER
config PRIMA2_TIMER config PRIMA2_TIMER
bool "Prima2 timer driver" if COMPILE_TEST bool "Prima2 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables support for the Prima2 timer. Enables support for the Prima2 timer.
config U300_TIMER config U300_TIMER
bool "U300 timer driver" if COMPILE_TEST bool "U300 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on ARM depends on ARM
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -215,14 +198,12 @@ config U300_TIMER
config NSPIRE_TIMER config NSPIRE_TIMER
bool "NSpire timer driver" if COMPILE_TEST bool "NSpire timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables support for the Nspire timer. Enables support for the Nspire timer.
config KEYSTONE_TIMER config KEYSTONE_TIMER
bool "Keystone timer driver" if COMPILE_TEST bool "Keystone timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on ARM || ARM64 depends on ARM || ARM64
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -230,7 +211,6 @@ config KEYSTONE_TIMER
config INTEGRATOR_AP_TIMER config INTEGRATOR_AP_TIMER
bool "Integrator-ap timer driver" if COMPILE_TEST bool "Integrator-ap timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables support for the Integrator-ap timer. Enables support for the Integrator-ap timer.
@ -253,7 +233,7 @@ config CLKSRC_EFM32
config CLKSRC_LPC32XX config CLKSRC_LPC32XX
bool "Clocksource for LPC32XX" if COMPILE_TEST bool "Clocksource for LPC32XX" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
depends on ARM depends on ARM
select CLKSRC_MMIO select CLKSRC_MMIO
select TIMER_OF select TIMER_OF
@ -262,7 +242,7 @@ config CLKSRC_LPC32XX
config CLKSRC_PISTACHIO config CLKSRC_PISTACHIO
bool "Clocksource for Pistachio SoC" if COMPILE_TEST bool "Clocksource for Pistachio SoC" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
select TIMER_OF select TIMER_OF
help help
Enables the clocksource for the Pistachio SoC. Enables the clocksource for the Pistachio SoC.
@ -298,7 +278,6 @@ config CLKSRC_MPS2
config ARC_TIMERS config ARC_TIMERS
bool "Support for 32-bit TIMERn counters in ARC Cores" if COMPILE_TEST bool "Support for 32-bit TIMERn counters in ARC Cores" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select TIMER_OF select TIMER_OF
help help
These are legacy 32-bit TIMER0 and TIMER1 counters found on all ARC cores These are legacy 32-bit TIMER0 and TIMER1 counters found on all ARC cores
@ -307,7 +286,6 @@ config ARC_TIMERS
config ARC_TIMERS_64BIT config ARC_TIMERS_64BIT
bool "Support for 64-bit counters in ARC HS38 cores" if COMPILE_TEST bool "Support for 64-bit counters in ARC HS38 cores" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on ARC_TIMERS depends on ARC_TIMERS
select TIMER_OF select TIMER_OF
help help
@ -407,7 +385,6 @@ config ATMEL_PIT
config ATMEL_ST config ATMEL_ST
bool "Atmel ST timer support" if COMPILE_TEST bool "Atmel ST timer support" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select TIMER_OF select TIMER_OF
select MFD_SYSCON select MFD_SYSCON
help help
@ -426,7 +403,6 @@ config CLKSRC_EXYNOS_MCT
config CLKSRC_SAMSUNG_PWM config CLKSRC_SAMSUNG_PWM
bool "PWM timer driver for Samsung S3C, S5P" if COMPILE_TEST bool "PWM timer driver for Samsung S3C, S5P" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
help help
This is a new clocksource driver for the PWM timer found in This is a new clocksource driver for the PWM timer found in
@ -436,7 +412,6 @@ config CLKSRC_SAMSUNG_PWM
config FSL_FTM_TIMER config FSL_FTM_TIMER
bool "Freescale FlexTimer Module driver" if COMPILE_TEST bool "Freescale FlexTimer Module driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -450,7 +425,6 @@ config VF_PIT_TIMER
config OXNAS_RPS_TIMER config OXNAS_RPS_TIMER
bool "Oxford Semiconductor OXNAS RPS Timers driver" if COMPILE_TEST bool "Oxford Semiconductor OXNAS RPS Timers driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select TIMER_OF select TIMER_OF
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -461,7 +435,7 @@ config SYS_SUPPORTS_SH_CMT
config MTK_TIMER config MTK_TIMER
bool "Mediatek timer driver" if COMPILE_TEST bool "Mediatek timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
select TIMER_OF select TIMER_OF
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -479,7 +453,6 @@ config SYS_SUPPORTS_EM_STI
config CLKSRC_JCORE_PIT config CLKSRC_JCORE_PIT
bool "J-Core PIT timer driver" if COMPILE_TEST bool "J-Core PIT timer driver" if COMPILE_TEST
depends on OF depends on OF
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -488,7 +461,6 @@ config CLKSRC_JCORE_PIT
config SH_TIMER_CMT config SH_TIMER_CMT
bool "Renesas CMT timer driver" if COMPILE_TEST bool "Renesas CMT timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
default SYS_SUPPORTS_SH_CMT default SYS_SUPPORTS_SH_CMT
help help
@ -498,7 +470,6 @@ config SH_TIMER_CMT
config SH_TIMER_MTU2 config SH_TIMER_MTU2
bool "Renesas MTU2 timer driver" if COMPILE_TEST bool "Renesas MTU2 timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
default SYS_SUPPORTS_SH_MTU2 default SYS_SUPPORTS_SH_MTU2
help help
@ -508,14 +479,12 @@ config SH_TIMER_MTU2
config RENESAS_OSTM config RENESAS_OSTM
bool "Renesas OSTM timer driver" if COMPILE_TEST bool "Renesas OSTM timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enables the support for the Renesas OSTM. Enables the support for the Renesas OSTM.
config SH_TIMER_TMU config SH_TIMER_TMU
bool "Renesas TMU timer driver" if COMPILE_TEST bool "Renesas TMU timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
default SYS_SUPPORTS_SH_TMU default SYS_SUPPORTS_SH_TMU
help help
@ -525,7 +494,7 @@ config SH_TIMER_TMU
config EM_TIMER_STI config EM_TIMER_STI
bool "Renesas STI timer driver" if COMPILE_TEST bool "Renesas STI timer driver" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
default SYS_SUPPORTS_EM_STI default SYS_SUPPORTS_EM_STI
help help
This enables build of a clocksource and clockevent driver for This enables build of a clocksource and clockevent driver for
@ -566,7 +535,6 @@ config CLKSRC_TANGO_XTAL
config CLKSRC_PXA config CLKSRC_PXA
bool "Clocksource for PXA or SA-11x0 platform" if COMPILE_TEST bool "Clocksource for PXA or SA-11x0 platform" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS
depends on HAS_IOMEM depends on HAS_IOMEM
select CLKSRC_MMIO select CLKSRC_MMIO
help help
@ -575,20 +543,20 @@ config CLKSRC_PXA
config H8300_TMR8 config H8300_TMR8
bool "Clockevent timer for the H8300 platform" if COMPILE_TEST bool "Clockevent timer for the H8300 platform" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
help help
This enables the 8 bits timer for the H8300 platform. This enables the 8 bits timer for the H8300 platform.
config H8300_TMR16 config H8300_TMR16
bool "Clockevent timer for the H83069 platform" if COMPILE_TEST bool "Clockevent timer for the H83069 platform" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
help help
This enables the 16 bits timer for the H8300 platform with the This enables the 16 bits timer for the H8300 platform with the
H83069 cpu. H83069 cpu.
config H8300_TPU config H8300_TPU
bool "Clocksource for the H8300 platform" if COMPILE_TEST bool "Clocksource for the H8300 platform" if COMPILE_TEST
depends on GENERIC_CLOCKEVENTS && HAS_IOMEM depends on HAS_IOMEM
help help
This enables the clocksource for the H8300 platform with the This enables the clocksource for the H8300 platform with the
H8S2678 cpu. H8S2678 cpu.
@ -600,7 +568,7 @@ config CLKSRC_IMX_GPT
config CLKSRC_IMX_TPM config CLKSRC_IMX_TPM
bool "Clocksource using i.MX TPM" if COMPILE_TEST bool "Clocksource using i.MX TPM" if COMPILE_TEST
depends on ARM && CLKDEV_LOOKUP && GENERIC_CLOCKEVENTS depends on ARM && CLKDEV_LOOKUP
select CLKSRC_MMIO select CLKSRC_MMIO
help help
Enable this option to use IMX Timer/PWM Module (TPM) timer as Enable this option to use IMX Timer/PWM Module (TPM) timer as

View File

@ -299,8 +299,7 @@ static u64 notrace arm64_858921_read_cntvct_el0(void)
#endif #endif
#ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND #ifdef CONFIG_ARM_ARCH_TIMER_OOL_WORKAROUND
DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, DEFINE_PER_CPU(const struct arch_timer_erratum_workaround *, timer_unstable_counter_workaround);
timer_unstable_counter_workaround);
EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround); EXPORT_SYMBOL_GPL(timer_unstable_counter_workaround);
DEFINE_STATIC_KEY_FALSE(arch_timer_read_ool_enabled); DEFINE_STATIC_KEY_FALSE(arch_timer_read_ool_enabled);
@ -1268,10 +1267,6 @@ arch_timer_mem_find_best_frame(struct arch_timer_mem *timer_mem)
iounmap(cntctlbase); iounmap(cntctlbase);
if (!best_frame)
pr_err("Unable to find a suitable frame in timer @ %pa\n",
&timer_mem->cntctlbase);
return best_frame; return best_frame;
} }
@ -1372,6 +1367,8 @@ static int __init arch_timer_mem_of_init(struct device_node *np)
frame = arch_timer_mem_find_best_frame(timer_mem); frame = arch_timer_mem_find_best_frame(timer_mem);
if (!frame) { if (!frame) {
pr_err("Unable to find a suitable frame in timer @ %pa\n",
&timer_mem->cntctlbase);
ret = -EINVAL; ret = -EINVAL;
goto out; goto out;
} }
@ -1420,7 +1417,7 @@ arch_timer_mem_verify_cntfrq(struct arch_timer_mem *timer_mem)
static int __init arch_timer_mem_acpi_init(int platform_timer_count) static int __init arch_timer_mem_acpi_init(int platform_timer_count)
{ {
struct arch_timer_mem *timers, *timer; struct arch_timer_mem *timers, *timer;
struct arch_timer_mem_frame *frame; struct arch_timer_mem_frame *frame, *best_frame = NULL;
int timer_count, i, ret = 0; int timer_count, i, ret = 0;
timers = kcalloc(platform_timer_count, sizeof(*timers), timers = kcalloc(platform_timer_count, sizeof(*timers),
@ -1432,14 +1429,6 @@ static int __init arch_timer_mem_acpi_init(int platform_timer_count)
if (ret || !timer_count) if (ret || !timer_count)
goto out; goto out;
for (i = 0; i < timer_count; i++) {
ret = arch_timer_mem_verify_cntfrq(&timers[i]);
if (ret) {
pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n");
goto out;
}
}
/* /*
* While unlikely, it's theoretically possible that none of the frames * While unlikely, it's theoretically possible that none of the frames
* in a timer expose the combination of feature we want. * in a timer expose the combination of feature we want.
@ -1448,12 +1437,26 @@ static int __init arch_timer_mem_acpi_init(int platform_timer_count)
timer = &timers[i]; timer = &timers[i];
frame = arch_timer_mem_find_best_frame(timer); frame = arch_timer_mem_find_best_frame(timer);
if (frame) if (!best_frame)
break; best_frame = frame;
ret = arch_timer_mem_verify_cntfrq(timer);
if (ret) {
pr_err("Disabling MMIO timers due to CNTFRQ mismatch\n");
goto out;
} }
if (frame) if (!best_frame) /* implies !frame */
ret = arch_timer_mem_frame_register(frame); /*
* Only complain about missing suitable frames if we
* haven't already found one in a previous iteration.
*/
pr_err("Unable to find a suitable frame in timer @ %pa\n",
&timer->cntctlbase);
}
if (best_frame)
ret = arch_timer_mem_frame_register(best_frame);
out: out:
kfree(timers); kfree(timers);
return ret; return ret;

View File

@ -39,16 +39,18 @@ static u64 notrace gic_read_count(void)
static int gic_next_event(unsigned long delta, struct clock_event_device *evt) static int gic_next_event(unsigned long delta, struct clock_event_device *evt)
{ {
unsigned long flags; int cpu = cpumask_first(evt->cpumask);
u64 cnt; u64 cnt;
int res; int res;
cnt = gic_read_count(); cnt = gic_read_count();
cnt += (u64)delta; cnt += (u64)delta;
local_irq_save(flags); if (cpu == raw_smp_processor_id()) {
write_gic_vl_other(mips_cm_vp_id(cpumask_first(evt->cpumask))); write_gic_vl_compare(cnt);
} else {
write_gic_vl_other(mips_cm_vp_id(cpu));
write_gic_vo_compare(cnt); write_gic_vo_compare(cnt);
local_irq_restore(flags); }
res = ((int)(gic_read_count() - cnt) >= 0) ? -ETIME : 0; res = ((int)(gic_read_count() - cnt) >= 0) ? -ETIME : 0;
return res; return res;
} }

View File

@ -125,7 +125,7 @@ static int __init owl_timer_init(struct device_node *node)
owl_timer_base = of_io_request_and_map(node, 0, "owl-timer"); owl_timer_base = of_io_request_and_map(node, 0, "owl-timer");
if (IS_ERR(owl_timer_base)) { if (IS_ERR(owl_timer_base)) {
pr_err("Can't map timer registers"); pr_err("Can't map timer registers\n");
return PTR_ERR(owl_timer_base); return PTR_ERR(owl_timer_base);
} }
@ -134,7 +134,7 @@ static int __init owl_timer_init(struct device_node *node)
timer1_irq = of_irq_get_byname(node, "timer1"); timer1_irq = of_irq_get_byname(node, "timer1");
if (timer1_irq <= 0) { if (timer1_irq <= 0) {
pr_err("Can't parse timer1 IRQ"); pr_err("Can't parse timer1 IRQ\n");
return -EINVAL; return -EINVAL;
} }

View File

@ -274,7 +274,7 @@ static int __init rk_clksrc_init(struct device_node *np)
TIMER_NAME, rk_clksrc->freq, 250, 32, TIMER_NAME, rk_clksrc->freq, 250, 32,
clocksource_mmio_readl_down); clocksource_mmio_readl_down);
if (ret) { if (ret) {
pr_err("Failed to register clocksource"); pr_err("Failed to register clocksource\n");
goto out_clocksource; goto out_clocksource;
} }

View File

@ -25,6 +25,7 @@
#include <linux/irq.h> #include <linux/irq.h>
#include <linux/module.h> #include <linux/module.h>
#include <linux/of.h> #include <linux/of.h>
#include <linux/of_device.h>
#include <linux/platform_device.h> #include <linux/platform_device.h>
#include <linux/pm_domain.h> #include <linux/pm_domain.h>
#include <linux/pm_runtime.h> #include <linux/pm_runtime.h>
@ -39,16 +40,16 @@ struct sh_cmt_device;
* SoC but also on the particular instance. The following table lists the main * SoC but also on the particular instance. The following table lists the main
* characteristics of those flavours. * characteristics of those flavours.
* *
* 16B 32B 32B-F 48B 48B-2 * 16B 32B 32B-F 48B R-Car Gen2
* ----------------------------------------------------------------------------- * -----------------------------------------------------------------------------
* Channels 2 1/4 1 6 2/8 * Channels 2 1/4 1 6 2/8
* Control Width 16 16 16 16 32 * Control Width 16 16 16 16 32
* Counter Width 16 32 32 32/48 32/48 * Counter Width 16 32 32 32/48 32/48
* Shared Start/Stop Y Y Y Y N * Shared Start/Stop Y Y Y Y N
* *
* The 48-bit gen2 version has a per-channel start/stop register located in the * The r8a73a4 / R-Car Gen2 version has a per-channel start/stop register
* channel registers block. All other versions have a shared start/stop register * located in the channel registers block. All other versions have a shared
* located in the global space. * start/stop register located in the global space.
* *
* Channels are indexed from 0 to N-1 in the documentation. The channel index * Channels are indexed from 0 to N-1 in the documentation. The channel index
* infers the start/stop bit position in the control register and the channel * infers the start/stop bit position in the control register and the channel
@ -66,14 +67,16 @@ struct sh_cmt_device;
enum sh_cmt_model { enum sh_cmt_model {
SH_CMT_16BIT, SH_CMT_16BIT,
SH_CMT_32BIT, SH_CMT_32BIT,
SH_CMT_32BIT_FAST,
SH_CMT_48BIT, SH_CMT_48BIT,
SH_CMT_48BIT_GEN2, SH_CMT0_RCAR_GEN2,
SH_CMT1_RCAR_GEN2,
}; };
struct sh_cmt_info { struct sh_cmt_info {
enum sh_cmt_model model; enum sh_cmt_model model;
unsigned int channels_mask;
unsigned long width; /* 16 or 32 bit version of hardware block */ unsigned long width; /* 16 or 32 bit version of hardware block */
unsigned long overflow_bit; unsigned long overflow_bit;
unsigned long clear_bits; unsigned long clear_bits;
@ -200,18 +203,9 @@ static const struct sh_cmt_info sh_cmt_info[] = {
.read_count = sh_cmt_read32, .read_count = sh_cmt_read32,
.write_count = sh_cmt_write32, .write_count = sh_cmt_write32,
}, },
[SH_CMT_32BIT_FAST] = {
.model = SH_CMT_32BIT_FAST,
.width = 32,
.overflow_bit = SH_CMT32_CMCSR_CMF,
.clear_bits = ~(SH_CMT32_CMCSR_CMF | SH_CMT32_CMCSR_OVF),
.read_control = sh_cmt_read16,
.write_control = sh_cmt_write16,
.read_count = sh_cmt_read32,
.write_count = sh_cmt_write32,
},
[SH_CMT_48BIT] = { [SH_CMT_48BIT] = {
.model = SH_CMT_48BIT, .model = SH_CMT_48BIT,
.channels_mask = 0x3f,
.width = 32, .width = 32,
.overflow_bit = SH_CMT32_CMCSR_CMF, .overflow_bit = SH_CMT32_CMCSR_CMF,
.clear_bits = ~(SH_CMT32_CMCSR_CMF | SH_CMT32_CMCSR_OVF), .clear_bits = ~(SH_CMT32_CMCSR_CMF | SH_CMT32_CMCSR_OVF),
@ -220,8 +214,20 @@ static const struct sh_cmt_info sh_cmt_info[] = {
.read_count = sh_cmt_read32, .read_count = sh_cmt_read32,
.write_count = sh_cmt_write32, .write_count = sh_cmt_write32,
}, },
[SH_CMT_48BIT_GEN2] = { [SH_CMT0_RCAR_GEN2] = {
.model = SH_CMT_48BIT_GEN2, .model = SH_CMT0_RCAR_GEN2,
.channels_mask = 0x60,
.width = 32,
.overflow_bit = SH_CMT32_CMCSR_CMF,
.clear_bits = ~(SH_CMT32_CMCSR_CMF | SH_CMT32_CMCSR_OVF),
.read_control = sh_cmt_read32,
.write_control = sh_cmt_write32,
.read_count = sh_cmt_read32,
.write_count = sh_cmt_write32,
},
[SH_CMT1_RCAR_GEN2] = {
.model = SH_CMT1_RCAR_GEN2,
.channels_mask = 0xff,
.width = 32, .width = 32,
.overflow_bit = SH_CMT32_CMCSR_CMF, .overflow_bit = SH_CMT32_CMCSR_CMF,
.clear_bits = ~(SH_CMT32_CMCSR_CMF | SH_CMT32_CMCSR_OVF), .clear_bits = ~(SH_CMT32_CMCSR_CMF | SH_CMT32_CMCSR_OVF),
@ -859,6 +865,7 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
ch->cmt = cmt; ch->cmt = cmt;
ch->index = index; ch->index = index;
ch->hwidx = hwidx; ch->hwidx = hwidx;
ch->timer_bit = hwidx;
/* /*
* Compute the address of the channel control register block. For the * Compute the address of the channel control register block. For the
@ -873,16 +880,11 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
case SH_CMT_48BIT: case SH_CMT_48BIT:
ch->ioctrl = cmt->mapbase + 0x10 + ch->hwidx * 0x10; ch->ioctrl = cmt->mapbase + 0x10 + ch->hwidx * 0x10;
break; break;
case SH_CMT_32BIT_FAST: case SH_CMT0_RCAR_GEN2:
/* case SH_CMT1_RCAR_GEN2:
* The 32-bit "fast" timer has a single channel at hwidx 5 but
* is located at offset 0x40 instead of 0x60 for some reason.
*/
ch->ioctrl = cmt->mapbase + 0x40;
break;
case SH_CMT_48BIT_GEN2:
ch->iostart = cmt->mapbase + ch->hwidx * 0x100; ch->iostart = cmt->mapbase + ch->hwidx * 0x100;
ch->ioctrl = ch->iostart + 0x10; ch->ioctrl = ch->iostart + 0x10;
ch->timer_bit = 0;
break; break;
} }
@ -894,8 +896,6 @@ static int sh_cmt_setup_channel(struct sh_cmt_channel *ch, unsigned int index,
ch->match_value = ch->max_match_value; ch->match_value = ch->max_match_value;
raw_spin_lock_init(&ch->lock); raw_spin_lock_init(&ch->lock);
ch->timer_bit = cmt->info->model == SH_CMT_48BIT_GEN2 ? 0 : ch->hwidx;
ret = sh_cmt_register(ch, dev_name(&cmt->pdev->dev), ret = sh_cmt_register(ch, dev_name(&cmt->pdev->dev),
clockevent, clocksource); clockevent, clocksource);
if (ret) { if (ret) {
@ -935,22 +935,18 @@ static const struct platform_device_id sh_cmt_id_table[] = {
MODULE_DEVICE_TABLE(platform, sh_cmt_id_table); MODULE_DEVICE_TABLE(platform, sh_cmt_id_table);
static const struct of_device_id sh_cmt_of_table[] __maybe_unused = { static const struct of_device_id sh_cmt_of_table[] __maybe_unused = {
{ .compatible = "renesas,cmt-32", .data = &sh_cmt_info[SH_CMT_32BIT] },
{ .compatible = "renesas,cmt-32-fast", .data = &sh_cmt_info[SH_CMT_32BIT_FAST] },
{ .compatible = "renesas,cmt-48", .data = &sh_cmt_info[SH_CMT_48BIT] }, { .compatible = "renesas,cmt-48", .data = &sh_cmt_info[SH_CMT_48BIT] },
{ .compatible = "renesas,cmt-48-gen2", .data = &sh_cmt_info[SH_CMT_48BIT_GEN2] }, {
/* deprecated, preserved for backward compatibility */
.compatible = "renesas,cmt-48-gen2",
.data = &sh_cmt_info[SH_CMT0_RCAR_GEN2]
},
{ .compatible = "renesas,rcar-gen2-cmt0", .data = &sh_cmt_info[SH_CMT0_RCAR_GEN2] },
{ .compatible = "renesas,rcar-gen2-cmt1", .data = &sh_cmt_info[SH_CMT1_RCAR_GEN2] },
{ } { }
}; };
MODULE_DEVICE_TABLE(of, sh_cmt_of_table); MODULE_DEVICE_TABLE(of, sh_cmt_of_table);
static int sh_cmt_parse_dt(struct sh_cmt_device *cmt)
{
struct device_node *np = cmt->pdev->dev.of_node;
return of_property_read_u32(np, "renesas,channels-mask",
&cmt->hw_channels);
}
static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev) static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev)
{ {
unsigned int mask; unsigned int mask;
@ -961,14 +957,8 @@ static int sh_cmt_setup(struct sh_cmt_device *cmt, struct platform_device *pdev)
raw_spin_lock_init(&cmt->lock); raw_spin_lock_init(&cmt->lock);
if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) { if (IS_ENABLED(CONFIG_OF) && pdev->dev.of_node) {
const struct of_device_id *id; cmt->info = of_device_get_match_data(&pdev->dev);
cmt->hw_channels = cmt->info->channels_mask;
id = of_match_node(sh_cmt_of_table, pdev->dev.of_node);
cmt->info = id->data;
ret = sh_cmt_parse_dt(cmt);
if (ret < 0)
return ret;
} else if (pdev->dev.platform_data) { } else if (pdev->dev.platform_data) {
struct sh_timer_config *cfg = pdev->dev.platform_data; struct sh_timer_config *cfg = pdev->dev.platform_data;
const struct platform_device_id *id = pdev->id_entry; const struct platform_device_id *id = pdev->id_entry;

View File

@ -264,14 +264,14 @@ static int __init fttmr010_common_init(struct device_node *np, bool is_aspeed)
fttmr010->base = of_iomap(np, 0); fttmr010->base = of_iomap(np, 0);
if (!fttmr010->base) { if (!fttmr010->base) {
pr_err("Can't remap registers"); pr_err("Can't remap registers\n");
ret = -ENXIO; ret = -ENXIO;
goto out_free; goto out_free;
} }
/* IRQ for timer 1 */ /* IRQ for timer 1 */
irq = irq_of_parse_and_map(np, 0); irq = irq_of_parse_and_map(np, 0);
if (irq <= 0) { if (irq <= 0) {
pr_err("Can't parse IRQ"); pr_err("Can't parse IRQ\n");
ret = -EINVAL; ret = -EINVAL;
goto out_unmap; goto out_unmap;
} }

View File

@ -176,3 +176,15 @@ out_fail:
timer_base_exit(&to->of_base); timer_base_exit(&to->of_base);
return ret; return ret;
} }
void timer_of_exit(struct timer_of *to)
{
if (to->flags & TIMER_OF_IRQ)
timer_irq_exit(&to->of_irq);
if (to->flags & TIMER_OF_CLOCK)
timer_clk_exit(&to->of_clk);
if (to->flags & TIMER_OF_BASE)
timer_base_exit(&to->of_base);
}

View File

@ -67,4 +67,7 @@ static inline unsigned long timer_of_period(struct timer_of *to)
extern int __init timer_of_init(struct device_node *np, extern int __init timer_of_init(struct device_node *np,
struct timer_of *to); struct timer_of *to);
extern void timer_of_exit(struct timer_of *to);
#endif #endif

View File

@ -90,6 +90,7 @@ struct global_pstate_info {
int last_gpstate_idx; int last_gpstate_idx;
spinlock_t gpstate_lock; spinlock_t gpstate_lock;
struct timer_list timer; struct timer_list timer;
struct cpufreq_policy *policy;
}; };
static struct cpufreq_frequency_table powernv_freqs[POWERNV_MAX_PSTATES+1]; static struct cpufreq_frequency_table powernv_freqs[POWERNV_MAX_PSTATES+1];
@ -625,10 +626,10 @@ static inline void queue_gpstate_timer(struct global_pstate_info *gpstates)
* according quadratic equation. Queues a new timer if it is still not equal * according quadratic equation. Queues a new timer if it is still not equal
* to local pstate * to local pstate
*/ */
void gpstate_timer_handler(unsigned long data) void gpstate_timer_handler(struct timer_list *t)
{ {
struct cpufreq_policy *policy = (struct cpufreq_policy *)data; struct global_pstate_info *gpstates = from_timer(gpstates, t, timer);
struct global_pstate_info *gpstates = policy->driver_data; struct cpufreq_policy *policy = gpstates->policy;
int gpstate_idx, lpstate_idx; int gpstate_idx, lpstate_idx;
unsigned long val; unsigned long val;
unsigned int time_diff = jiffies_to_msecs(jiffies) unsigned int time_diff = jiffies_to_msecs(jiffies)
@ -800,9 +801,9 @@ static int powernv_cpufreq_cpu_init(struct cpufreq_policy *policy)
policy->driver_data = gpstates; policy->driver_data = gpstates;
/* initialize timer */ /* initialize timer */
init_timer_pinned_deferrable(&gpstates->timer); gpstates->policy = policy;
gpstates->timer.data = (unsigned long)policy; timer_setup(&gpstates->timer, gpstate_timer_handler,
gpstates->timer.function = gpstate_timer_handler; TIMER_PINNED | TIMER_DEFERRABLE);
gpstates->timer.expires = jiffies + gpstates->timer.expires = jiffies +
msecs_to_jiffies(GPSTATE_TIMER_INTERVAL); msecs_to_jiffies(GPSTATE_TIMER_INTERVAL);
spin_lock_init(&gpstates->gpstate_lock); spin_lock_init(&gpstates->gpstate_lock);

View File

@ -2072,9 +2072,9 @@ static void artpec6_crypto_process_queue(struct artpec6_crypto *ac)
del_timer(&ac->timer); del_timer(&ac->timer);
} }
static void artpec6_crypto_timeout(unsigned long data) static void artpec6_crypto_timeout(struct timer_list *t)
{ {
struct artpec6_crypto *ac = (struct artpec6_crypto *) data; struct artpec6_crypto *ac = from_timer(ac, t, timer);
dev_info_ratelimited(artpec6_crypto_dev, "timeout\n"); dev_info_ratelimited(artpec6_crypto_dev, "timeout\n");
@ -3063,7 +3063,7 @@ static int artpec6_crypto_probe(struct platform_device *pdev)
spin_lock_init(&ac->queue_lock); spin_lock_init(&ac->queue_lock);
INIT_LIST_HEAD(&ac->queue); INIT_LIST_HEAD(&ac->queue);
INIT_LIST_HEAD(&ac->pending); INIT_LIST_HEAD(&ac->pending);
setup_timer(&ac->timer, artpec6_crypto_timeout, (unsigned long) ac); timer_setup(&ac->timer, artpec6_crypto_timeout, 0);
ac->base = base; ac->base = base;

View File

@ -149,7 +149,7 @@ struct mv_req_hash_ctx {
int count_add; int count_add;
}; };
static void mv_completion_timer_callback(unsigned long unused) static void mv_completion_timer_callback(struct timer_list *unused)
{ {
int active = readl(cpg->reg + SEC_ACCEL_CMD) & SEC_CMD_EN_SEC_ACCL0; int active = readl(cpg->reg + SEC_ACCEL_CMD) & SEC_CMD_EN_SEC_ACCL0;
@ -167,7 +167,7 @@ static void mv_completion_timer_callback(unsigned long unused)
static void mv_setup_timer(void) static void mv_setup_timer(void)
{ {
setup_timer(&cpg->completion_timer, &mv_completion_timer_callback, 0); timer_setup(&cpg->completion_timer, mv_completion_timer_callback, 0);
mod_timer(&cpg->completion_timer, mod_timer(&cpg->completion_timer,
jiffies + msecs_to_jiffies(MV_CESA_EXPIRE)); jiffies + msecs_to_jiffies(MV_CESA_EXPIRE));
} }

View File

@ -1125,9 +1125,9 @@ static irqreturn_t spacc_spacc_irq(int irq, void *dev)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void spacc_packet_timeout(unsigned long data) static void spacc_packet_timeout(struct timer_list *t)
{ {
struct spacc_engine *engine = (struct spacc_engine *)data; struct spacc_engine *engine = from_timer(engine, t, packet_timeout);
spacc_process_done(engine); spacc_process_done(engine);
} }
@ -1714,8 +1714,7 @@ static int spacc_probe(struct platform_device *pdev)
writel(SPA_IRQ_EN_STAT_EN | SPA_IRQ_EN_GLBL_EN, writel(SPA_IRQ_EN_STAT_EN | SPA_IRQ_EN_GLBL_EN,
engine->regs + SPA_IRQ_EN_REG_OFFSET); engine->regs + SPA_IRQ_EN_REG_OFFSET);
setup_timer(&engine->packet_timeout, spacc_packet_timeout, timer_setup(&engine->packet_timeout, spacc_packet_timeout, 0);
(unsigned long)engine);
INIT_LIST_HEAD(&engine->pending); INIT_LIST_HEAD(&engine->pending);
INIT_LIST_HEAD(&engine->completed); INIT_LIST_HEAD(&engine->completed);

View File

@ -137,9 +137,9 @@ int fw_cancel_transaction(struct fw_card *card,
} }
EXPORT_SYMBOL(fw_cancel_transaction); EXPORT_SYMBOL(fw_cancel_transaction);
static void split_transaction_timeout_callback(unsigned long data) static void split_transaction_timeout_callback(struct timer_list *timer)
{ {
struct fw_transaction *t = (struct fw_transaction *)data; struct fw_transaction *t = from_timer(t, timer, split_timeout_timer);
struct fw_card *card = t->card; struct fw_card *card = t->card;
unsigned long flags; unsigned long flags;
@ -373,8 +373,8 @@ void fw_send_request(struct fw_card *card, struct fw_transaction *t, int tcode,
t->tlabel = tlabel; t->tlabel = tlabel;
t->card = card; t->card = card;
t->is_split_transaction = false; t->is_split_transaction = false;
setup_timer(&t->split_timeout_timer, timer_setup(&t->split_timeout_timer,
split_transaction_timeout_callback, (unsigned long)t); split_transaction_timeout_callback, 0);
t->callback = callback; t->callback = callback;
t->callback_data = callback_data; t->callback_data = callback_data;
@ -423,7 +423,7 @@ int fw_run_transaction(struct fw_card *card, int tcode, int destination_id,
struct transaction_callback_data d; struct transaction_callback_data d;
struct fw_transaction t; struct fw_transaction t;
init_timer_on_stack(&t.split_timeout_timer); timer_setup_on_stack(&t.split_timeout_timer, NULL, 0);
init_completion(&d.done); init_completion(&d.done);
d.payload = payload; d.payload = payload;
fw_send_request(card, &t, tcode, destination_id, generation, speed, fw_send_request(card, &t, tcode, destination_id, generation, speed,

View File

@ -975,9 +975,9 @@ static void hangcheck_timer_reset(struct etnaviv_gpu *gpu)
round_jiffies_up(jiffies + DRM_ETNAVIV_HANGCHECK_JIFFIES)); round_jiffies_up(jiffies + DRM_ETNAVIV_HANGCHECK_JIFFIES));
} }
static void hangcheck_handler(unsigned long data) static void hangcheck_handler(struct timer_list *t)
{ {
struct etnaviv_gpu *gpu = (struct etnaviv_gpu *)data; struct etnaviv_gpu *gpu = from_timer(gpu, t, hangcheck_timer);
u32 fence = gpu->completed_fence; u32 fence = gpu->completed_fence;
bool progress = false; bool progress = false;
@ -1648,8 +1648,7 @@ static int etnaviv_gpu_bind(struct device *dev, struct device *master,
INIT_WORK(&gpu->recover_work, recover_worker); INIT_WORK(&gpu->recover_work, recover_worker);
init_waitqueue_head(&gpu->fence_event); init_waitqueue_head(&gpu->fence_event);
setup_deferrable_timer(&gpu->hangcheck_timer, hangcheck_handler, timer_setup(&gpu->hangcheck_timer, hangcheck_handler, TIMER_DEFERRABLE);
(unsigned long)gpu);
priv->gpu[priv->num_gpus++] = gpu; priv->gpu[priv->num_gpus++] = gpu;

View File

@ -23,9 +23,9 @@
#include "psb_intel_reg.h" #include "psb_intel_reg.h"
#include <linux/spinlock.h> #include <linux/spinlock.h>
static void psb_lid_timer_func(unsigned long data) static void psb_lid_timer_func(struct timer_list *t)
{ {
struct drm_psb_private * dev_priv = (struct drm_psb_private *)data; struct drm_psb_private *dev_priv = from_timer(dev_priv, t, lid_timer);
struct drm_device *dev = (struct drm_device *)dev_priv->dev; struct drm_device *dev = (struct drm_device *)dev_priv->dev;
struct timer_list *lid_timer = &dev_priv->lid_timer; struct timer_list *lid_timer = &dev_priv->lid_timer;
unsigned long irq_flags; unsigned long irq_flags;
@ -77,10 +77,8 @@ void psb_lid_timer_init(struct drm_psb_private *dev_priv)
spin_lock_init(&dev_priv->lid_lock); spin_lock_init(&dev_priv->lid_lock);
spin_lock_irqsave(&dev_priv->lid_lock, irq_flags); spin_lock_irqsave(&dev_priv->lid_lock, irq_flags);
init_timer(lid_timer); timer_setup(lid_timer, psb_lid_timer_func, 0);
lid_timer->data = (unsigned long)dev_priv;
lid_timer->function = psb_lid_timer_func;
lid_timer->expires = jiffies + PSB_LID_DELAY; lid_timer->expires = jiffies + PSB_LID_DELAY;
add_timer(lid_timer); add_timer(lid_timer);

View File

@ -464,10 +464,10 @@ static void ssip_error(struct hsi_client *cl)
hsi_async_read(cl, msg); hsi_async_read(cl, msg);
} }
static void ssip_keep_alive(unsigned long data) static void ssip_keep_alive(struct timer_list *t)
{ {
struct hsi_client *cl = (struct hsi_client *)data; struct ssi_protocol *ssi = from_timer(ssi, t, keep_alive);
struct ssi_protocol *ssi = hsi_client_drvdata(cl); struct hsi_client *cl = ssi->cl;
dev_dbg(&cl->device, "Keep alive kick in: m(%d) r(%d) s(%d)\n", dev_dbg(&cl->device, "Keep alive kick in: m(%d) r(%d) s(%d)\n",
ssi->main_state, ssi->recv_state, ssi->send_state); ssi->main_state, ssi->recv_state, ssi->send_state);
@ -490,9 +490,19 @@ static void ssip_keep_alive(unsigned long data)
spin_unlock(&ssi->lock); spin_unlock(&ssi->lock);
} }
static void ssip_wd(unsigned long data) static void ssip_rx_wd(struct timer_list *t)
{ {
struct hsi_client *cl = (struct hsi_client *)data; struct ssi_protocol *ssi = from_timer(ssi, t, rx_wd);
struct hsi_client *cl = ssi->cl;
dev_err(&cl->device, "Watchdog trigerred\n");
ssip_error(cl);
}
static void ssip_tx_wd(struct timer_list *t)
{
struct ssi_protocol *ssi = from_timer(ssi, t, tx_wd);
struct hsi_client *cl = ssi->cl;
dev_err(&cl->device, "Watchdog trigerred\n"); dev_err(&cl->device, "Watchdog trigerred\n");
ssip_error(cl); ssip_error(cl);
@ -1084,15 +1094,9 @@ static int ssi_protocol_probe(struct device *dev)
} }
spin_lock_init(&ssi->lock); spin_lock_init(&ssi->lock);
init_timer_deferrable(&ssi->rx_wd); timer_setup(&ssi->rx_wd, ssip_rx_wd, TIMER_DEFERRABLE);
init_timer_deferrable(&ssi->tx_wd); timer_setup(&ssi->tx_wd, ssip_tx_wd, TIMER_DEFERRABLE);
init_timer(&ssi->keep_alive); timer_setup(&ssi->keep_alive, ssip_keep_alive, 0);
ssi->rx_wd.data = (unsigned long)cl;
ssi->rx_wd.function = ssip_wd;
ssi->tx_wd.data = (unsigned long)cl;
ssi->tx_wd.function = ssip_wd;
ssi->keep_alive.data = (unsigned long)cl;
ssi->keep_alive.function = ssip_keep_alive;
INIT_LIST_HEAD(&ssi->txqueue); INIT_LIST_HEAD(&ssi->txqueue);
INIT_LIST_HEAD(&ssi->cmdqueue); INIT_LIST_HEAD(&ssi->cmdqueue);
atomic_set(&ssi->tx_usecnt, 0); atomic_set(&ssi->tx_usecnt, 0);

View File

@ -611,9 +611,9 @@ static int drive_is_ready(ide_drive_t *drive)
* logic that wants cleaning up. * logic that wants cleaning up.
*/ */
void ide_timer_expiry (unsigned long data) void ide_timer_expiry (struct timer_list *t)
{ {
ide_hwif_t *hwif = (ide_hwif_t *)data; ide_hwif_t *hwif = from_timer(hwif, t, timer);
ide_drive_t *uninitialized_var(drive); ide_drive_t *uninitialized_var(drive);
ide_handler_t *handler; ide_handler_t *handler;
unsigned long flags; unsigned long flags;

View File

@ -1184,7 +1184,7 @@ static void ide_init_port_data(ide_hwif_t *hwif, unsigned int index)
spin_lock_init(&hwif->lock); spin_lock_init(&hwif->lock);
setup_timer(&hwif->timer, &ide_timer_expiry, (unsigned long)hwif); timer_setup(&hwif->timer, ide_timer_expiry, 0);
init_completion(&hwif->gendev_rel_comp); init_completion(&hwif->gendev_rel_comp);

View File

@ -145,7 +145,7 @@ static void touch_timer_fire(unsigned long data)
} }
} }
static DEFINE_TIMER(touch_timer, touch_timer_fire, 0, 0); static DEFINE_TIMER(touch_timer, touch_timer_fire);
/** /**
* stylus_irq - touchscreen stylus event interrupt * stylus_irq - touchscreen stylus event interrupt

View File

@ -103,7 +103,7 @@ static DEFINE_MUTEX(smu_part_access);
static int smu_irq_inited; static int smu_irq_inited;
static unsigned long smu_cmdbuf_abs; static unsigned long smu_cmdbuf_abs;
static void smu_i2c_retry(unsigned long data); static void smu_i2c_retry(struct timer_list *t);
/* /*
* SMU driver low level stuff * SMU driver low level stuff
@ -582,9 +582,7 @@ static int smu_late_init(void)
if (!smu) if (!smu)
return 0; return 0;
init_timer(&smu->i2c_timer); timer_setup(&smu->i2c_timer, smu_i2c_retry, 0);
smu->i2c_timer.function = smu_i2c_retry;
smu->i2c_timer.data = (unsigned long)smu;
if (smu->db_node) { if (smu->db_node) {
smu->db_irq = irq_of_parse_and_map(smu->db_node, 0); smu->db_irq = irq_of_parse_and_map(smu->db_node, 0);
@ -755,7 +753,7 @@ static void smu_i2c_complete_command(struct smu_i2c_cmd *cmd, int fail)
} }
static void smu_i2c_retry(unsigned long data) static void smu_i2c_retry(struct timer_list *unused)
{ {
struct smu_i2c_cmd *cmd = smu->cmd_i2c_cur; struct smu_i2c_cmd *cmd = smu->cmd_i2c_cur;
@ -795,7 +793,7 @@ static void smu_i2c_low_completion(struct smu_cmd *scmd, void *misc)
BUG_ON(cmd != smu->cmd_i2c_cur); BUG_ON(cmd != smu->cmd_i2c_cur);
if (!smu_irq_inited) { if (!smu_irq_inited) {
mdelay(5); mdelay(5);
smu_i2c_retry(0); smu_i2c_retry(NULL);
return; return;
} }
mod_timer(&smu->i2c_timer, jiffies + msecs_to_jiffies(5)); mod_timer(&smu->i2c_timer, jiffies + msecs_to_jiffies(5));

View File

@ -57,6 +57,7 @@ struct altera_mbox {
/* If the controller supports only RX polling mode */ /* If the controller supports only RX polling mode */
struct timer_list rxpoll_timer; struct timer_list rxpoll_timer;
struct mbox_chan *chan;
}; };
static struct altera_mbox *mbox_chan_to_altera_mbox(struct mbox_chan *chan) static struct altera_mbox *mbox_chan_to_altera_mbox(struct mbox_chan *chan)
@ -138,12 +139,11 @@ static void altera_mbox_rx_data(struct mbox_chan *chan)
} }
} }
static void altera_mbox_poll_rx(unsigned long data) static void altera_mbox_poll_rx(struct timer_list *t)
{ {
struct mbox_chan *chan = (struct mbox_chan *)data; struct altera_mbox *mbox = from_timer(mbox, t, rxpoll_timer);
struct altera_mbox *mbox = mbox_chan_to_altera_mbox(chan);
altera_mbox_rx_data(chan); altera_mbox_rx_data(mbox->chan);
mod_timer(&mbox->rxpoll_timer, mod_timer(&mbox->rxpoll_timer,
jiffies + msecs_to_jiffies(MBOX_POLLING_MS)); jiffies + msecs_to_jiffies(MBOX_POLLING_MS));
@ -206,8 +206,8 @@ static int altera_mbox_startup_receiver(struct mbox_chan *chan)
polling: polling:
/* Setup polling timer */ /* Setup polling timer */
setup_timer(&mbox->rxpoll_timer, altera_mbox_poll_rx, mbox->chan = chan;
(unsigned long)chan); timer_setup(&mbox->rxpoll_timer, altera_mbox_poll_rx, 0);
mod_timer(&mbox->rxpoll_timer, mod_timer(&mbox->rxpoll_timer,
jiffies + msecs_to_jiffies(MBOX_POLLING_MS)); jiffies + msecs_to_jiffies(MBOX_POLLING_MS));

View File

@ -330,10 +330,10 @@ static void pvr2_hdw_state_log_state(struct pvr2_hdw *);
static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl); static int pvr2_hdw_cmd_usbstream(struct pvr2_hdw *hdw,int runFl);
static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw); static int pvr2_hdw_commit_setup(struct pvr2_hdw *hdw);
static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw); static int pvr2_hdw_get_eeprom_addr(struct pvr2_hdw *hdw);
static void pvr2_hdw_quiescent_timeout(unsigned long); static void pvr2_hdw_quiescent_timeout(struct timer_list *);
static void pvr2_hdw_decoder_stabilization_timeout(unsigned long); static void pvr2_hdw_decoder_stabilization_timeout(struct timer_list *);
static void pvr2_hdw_encoder_wait_timeout(unsigned long); static void pvr2_hdw_encoder_wait_timeout(struct timer_list *);
static void pvr2_hdw_encoder_run_timeout(unsigned long); static void pvr2_hdw_encoder_run_timeout(struct timer_list *);
static int pvr2_issue_simple_cmd(struct pvr2_hdw *,u32); static int pvr2_issue_simple_cmd(struct pvr2_hdw *,u32);
static int pvr2_send_request_ex(struct pvr2_hdw *hdw, static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
unsigned int timeout,int probe_fl, unsigned int timeout,int probe_fl,
@ -2373,18 +2373,15 @@ struct pvr2_hdw *pvr2_hdw_create(struct usb_interface *intf,
} }
if (!hdw) goto fail; if (!hdw) goto fail;
setup_timer(&hdw->quiescent_timer, pvr2_hdw_quiescent_timeout, timer_setup(&hdw->quiescent_timer, pvr2_hdw_quiescent_timeout, 0);
(unsigned long)hdw);
setup_timer(&hdw->decoder_stabilization_timer, timer_setup(&hdw->decoder_stabilization_timer,
pvr2_hdw_decoder_stabilization_timeout, pvr2_hdw_decoder_stabilization_timeout, 0);
(unsigned long)hdw);
setup_timer(&hdw->encoder_wait_timer, pvr2_hdw_encoder_wait_timeout, timer_setup(&hdw->encoder_wait_timer, pvr2_hdw_encoder_wait_timeout,
(unsigned long)hdw); 0);
setup_timer(&hdw->encoder_run_timer, pvr2_hdw_encoder_run_timeout, timer_setup(&hdw->encoder_run_timer, pvr2_hdw_encoder_run_timeout, 0);
(unsigned long)hdw);
hdw->master_state = PVR2_STATE_DEAD; hdw->master_state = PVR2_STATE_DEAD;
@ -3539,10 +3536,16 @@ static void pvr2_ctl_read_complete(struct urb *urb)
complete(&hdw->ctl_done); complete(&hdw->ctl_done);
} }
struct hdw_timer {
struct timer_list timer;
struct pvr2_hdw *hdw;
};
static void pvr2_ctl_timeout(unsigned long data) static void pvr2_ctl_timeout(struct timer_list *t)
{ {
struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; struct hdw_timer *timer = from_timer(timer, t, timer);
struct pvr2_hdw *hdw = timer->hdw;
if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) { if (hdw->ctl_write_pend_flag || hdw->ctl_read_pend_flag) {
hdw->ctl_timeout_flag = !0; hdw->ctl_timeout_flag = !0;
if (hdw->ctl_write_pend_flag) if (hdw->ctl_write_pend_flag)
@ -3564,7 +3567,10 @@ static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
{ {
unsigned int idx; unsigned int idx;
int status = 0; int status = 0;
struct timer_list timer; struct hdw_timer timer = {
.hdw = hdw,
};
if (!hdw->ctl_lock_held) { if (!hdw->ctl_lock_held) {
pvr2_trace(PVR2_TRACE_ERROR_LEGS, pvr2_trace(PVR2_TRACE_ERROR_LEGS,
"Attempted to execute control transfer without lock!!"); "Attempted to execute control transfer without lock!!");
@ -3621,8 +3627,8 @@ static int pvr2_send_request_ex(struct pvr2_hdw *hdw,
hdw->ctl_timeout_flag = 0; hdw->ctl_timeout_flag = 0;
hdw->ctl_write_pend_flag = 0; hdw->ctl_write_pend_flag = 0;
hdw->ctl_read_pend_flag = 0; hdw->ctl_read_pend_flag = 0;
setup_timer(&timer, pvr2_ctl_timeout, (unsigned long)hdw); timer_setup_on_stack(&timer.timer, pvr2_ctl_timeout, 0);
timer.expires = jiffies + timeout; timer.timer.expires = jiffies + timeout;
if (write_len && write_data) { if (write_len && write_data) {
hdw->cmd_debug_state = 2; hdw->cmd_debug_state = 2;
@ -3677,7 +3683,7 @@ status);
} }
/* Start timer */ /* Start timer */
add_timer(&timer); add_timer(&timer.timer);
/* Now wait for all I/O to complete */ /* Now wait for all I/O to complete */
hdw->cmd_debug_state = 4; hdw->cmd_debug_state = 4;
@ -3687,7 +3693,7 @@ status);
hdw->cmd_debug_state = 5; hdw->cmd_debug_state = 5;
/* Stop timer */ /* Stop timer */
del_timer_sync(&timer); del_timer_sync(&timer.timer);
hdw->cmd_debug_state = 6; hdw->cmd_debug_state = 6;
status = 0; status = 0;
@ -3769,6 +3775,8 @@ status);
if ((status < 0) && (!probe_fl)) { if ((status < 0) && (!probe_fl)) {
pvr2_hdw_render_useless(hdw); pvr2_hdw_render_useless(hdw);
} }
destroy_timer_on_stack(&timer.timer);
return status; return status;
} }
@ -4366,9 +4374,9 @@ static int state_eval_encoder_run(struct pvr2_hdw *hdw)
/* Timeout function for quiescent timer. */ /* Timeout function for quiescent timer. */
static void pvr2_hdw_quiescent_timeout(unsigned long data) static void pvr2_hdw_quiescent_timeout(struct timer_list *t)
{ {
struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; struct pvr2_hdw *hdw = from_timer(hdw, t, quiescent_timer);
hdw->state_decoder_quiescent = !0; hdw->state_decoder_quiescent = !0;
trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent); trace_stbit("state_decoder_quiescent",hdw->state_decoder_quiescent);
hdw->state_stale = !0; hdw->state_stale = !0;
@ -4377,9 +4385,9 @@ static void pvr2_hdw_quiescent_timeout(unsigned long data)
/* Timeout function for decoder stabilization timer. */ /* Timeout function for decoder stabilization timer. */
static void pvr2_hdw_decoder_stabilization_timeout(unsigned long data) static void pvr2_hdw_decoder_stabilization_timeout(struct timer_list *t)
{ {
struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; struct pvr2_hdw *hdw = from_timer(hdw, t, decoder_stabilization_timer);
hdw->state_decoder_ready = !0; hdw->state_decoder_ready = !0;
trace_stbit("state_decoder_ready", hdw->state_decoder_ready); trace_stbit("state_decoder_ready", hdw->state_decoder_ready);
hdw->state_stale = !0; hdw->state_stale = !0;
@ -4388,9 +4396,9 @@ static void pvr2_hdw_decoder_stabilization_timeout(unsigned long data)
/* Timeout function for encoder wait timer. */ /* Timeout function for encoder wait timer. */
static void pvr2_hdw_encoder_wait_timeout(unsigned long data) static void pvr2_hdw_encoder_wait_timeout(struct timer_list *t)
{ {
struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; struct pvr2_hdw *hdw = from_timer(hdw, t, encoder_wait_timer);
hdw->state_encoder_waitok = !0; hdw->state_encoder_waitok = !0;
trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok); trace_stbit("state_encoder_waitok",hdw->state_encoder_waitok);
hdw->state_stale = !0; hdw->state_stale = !0;
@ -4399,9 +4407,9 @@ static void pvr2_hdw_encoder_wait_timeout(unsigned long data)
/* Timeout function for encoder run timer. */ /* Timeout function for encoder run timer. */
static void pvr2_hdw_encoder_run_timeout(unsigned long data) static void pvr2_hdw_encoder_run_timeout(struct timer_list *t)
{ {
struct pvr2_hdw *hdw = (struct pvr2_hdw *)data; struct pvr2_hdw *hdw = from_timer(hdw, t, encoder_run_timer);
if (!hdw->state_encoder_runok) { if (!hdw->state_encoder_runok) {
hdw->state_encoder_runok = !0; hdw->state_encoder_runok = !0;
trace_stbit("state_encoder_runok",hdw->state_encoder_runok); trace_stbit("state_encoder_runok",hdw->state_encoder_runok);

View File

@ -59,6 +59,7 @@ struct jmb38x_ms_host {
unsigned int block_pos; unsigned int block_pos;
unsigned long timeout_jiffies; unsigned long timeout_jiffies;
struct timer_list timer; struct timer_list timer;
struct memstick_host *msh;
struct memstick_request *req; struct memstick_request *req;
unsigned char cmd_flags; unsigned char cmd_flags;
unsigned char io_pos; unsigned char io_pos;
@ -592,10 +593,10 @@ static irqreturn_t jmb38x_ms_isr(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void jmb38x_ms_abort(unsigned long data) static void jmb38x_ms_abort(struct timer_list *t)
{ {
struct memstick_host *msh = (struct memstick_host *)data; struct jmb38x_ms_host *host = from_timer(host, t, timer);
struct jmb38x_ms_host *host = memstick_priv(msh); struct memstick_host *msh = host->msh;
unsigned long flags; unsigned long flags;
dev_dbg(&host->chip->pdev->dev, "abort\n"); dev_dbg(&host->chip->pdev->dev, "abort\n");
@ -878,6 +879,7 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt)
return NULL; return NULL;
host = memstick_priv(msh); host = memstick_priv(msh);
host->msh = msh;
host->chip = jm; host->chip = jm;
host->addr = ioremap(pci_resource_start(jm->pdev, cnt), host->addr = ioremap(pci_resource_start(jm->pdev, cnt),
pci_resource_len(jm->pdev, cnt)); pci_resource_len(jm->pdev, cnt));
@ -897,7 +899,7 @@ static struct memstick_host *jmb38x_ms_alloc_host(struct jmb38x_ms *jm, int cnt)
msh->caps = MEMSTICK_CAP_PAR4 | MEMSTICK_CAP_PAR8; msh->caps = MEMSTICK_CAP_PAR4 | MEMSTICK_CAP_PAR8;
setup_timer(&host->timer, jmb38x_ms_abort, (unsigned long)msh); timer_setup(&host->timer, jmb38x_ms_abort, 0);
if (!request_irq(host->irq, jmb38x_ms_isr, IRQF_SHARED, host->host_id, if (!request_irq(host->irq, jmb38x_ms_isr, IRQF_SHARED, host->host_id,
msh)) msh))

View File

@ -616,9 +616,9 @@ static void r592_update_card_detect(struct r592_device *dev)
} }
/* Timer routine that fires 1 second after last card detection event, */ /* Timer routine that fires 1 second after last card detection event, */
static void r592_detect_timer(long unsigned int data) static void r592_detect_timer(struct timer_list *t)
{ {
struct r592_device *dev = (struct r592_device *)data; struct r592_device *dev = from_timer(dev, t, detect_timer);
r592_update_card_detect(dev); r592_update_card_detect(dev);
memstick_detect_change(dev->host); memstick_detect_change(dev->host);
} }
@ -770,8 +770,7 @@ static int r592_probe(struct pci_dev *pdev, const struct pci_device_id *id)
spin_lock_init(&dev->io_thread_lock); spin_lock_init(&dev->io_thread_lock);
init_completion(&dev->dma_done); init_completion(&dev->dma_done);
INIT_KFIFO(dev->pio_fifo); INIT_KFIFO(dev->pio_fifo);
setup_timer(&dev->detect_timer, timer_setup(&dev->detect_timer, r592_detect_timer, 0);
r592_detect_timer, (long unsigned int)dev);
/* Host initialization */ /* Host initialization */
host->caps = MEMSTICK_CAP_PAR4; host->caps = MEMSTICK_CAP_PAR4;

View File

@ -538,9 +538,9 @@ static int tifm_ms_set_param(struct memstick_host *msh,
return 0; return 0;
} }
static void tifm_ms_abort(unsigned long data) static void tifm_ms_abort(struct timer_list *t)
{ {
struct tifm_ms *host = (struct tifm_ms *)data; struct tifm_ms *host = from_timer(host, t, timer);
dev_dbg(&host->dev->dev, "status %x\n", dev_dbg(&host->dev->dev, "status %x\n",
readl(host->dev->addr + SOCK_MS_STATUS)); readl(host->dev->addr + SOCK_MS_STATUS));
@ -575,7 +575,7 @@ static int tifm_ms_probe(struct tifm_dev *sock)
host->dev = sock; host->dev = sock;
host->timeout_jiffies = msecs_to_jiffies(1000); host->timeout_jiffies = msecs_to_jiffies(1000);
setup_timer(&host->timer, tifm_ms_abort, (unsigned long)host); timer_setup(&host->timer, tifm_ms_abort, 0);
tasklet_init(&host->notify, tifm_ms_req_tasklet, (unsigned long)msh); tasklet_init(&host->notify, tifm_ms_req_tasklet, (unsigned long)msh);
msh->request = tifm_ms_submit_req; msh->request = tifm_ms_submit_req;

View File

@ -172,9 +172,9 @@ struct xpc_arch_operations xpc_arch_ops;
* Timer function to enforce the timelimit on the partition disengage. * Timer function to enforce the timelimit on the partition disengage.
*/ */
static void static void
xpc_timeout_partition_disengage(unsigned long data) xpc_timeout_partition_disengage(struct timer_list *t)
{ {
struct xpc_partition *part = (struct xpc_partition *)data; struct xpc_partition *part = from_timer(part, t, disengage_timer);
DBUG_ON(time_is_after_jiffies(part->disengage_timeout)); DBUG_ON(time_is_after_jiffies(part->disengage_timeout));
@ -190,7 +190,7 @@ xpc_timeout_partition_disengage(unsigned long data)
* specify when the next timeout should occur. * specify when the next timeout should occur.
*/ */
static void static void
xpc_hb_beater(unsigned long dummy) xpc_hb_beater(struct timer_list *unused)
{ {
xpc_arch_ops.increment_heartbeat(); xpc_arch_ops.increment_heartbeat();
@ -205,8 +205,7 @@ static void
xpc_start_hb_beater(void) xpc_start_hb_beater(void)
{ {
xpc_arch_ops.heartbeat_init(); xpc_arch_ops.heartbeat_init();
init_timer(&xpc_hb_timer); timer_setup(&xpc_hb_timer, xpc_hb_beater, 0);
xpc_hb_timer.function = xpc_hb_beater;
xpc_hb_beater(0); xpc_hb_beater(0);
} }
@ -931,10 +930,8 @@ xpc_setup_partitions(void)
part->act_state = XPC_P_AS_INACTIVE; part->act_state = XPC_P_AS_INACTIVE;
XPC_SET_REASON(part, 0, 0); XPC_SET_REASON(part, 0, 0);
init_timer(&part->disengage_timer); timer_setup(&part->disengage_timer,
part->disengage_timer.function = xpc_timeout_partition_disengage, 0);
xpc_timeout_partition_disengage;
part->disengage_timer.data = (unsigned long)part;
part->setup_state = XPC_P_SS_UNSET; part->setup_state = XPC_P_SS_UNSET;
init_waitqueue_head(&part->teardown_wq); init_waitqueue_head(&part->teardown_wq);

View File

@ -323,16 +323,16 @@ xpc_handle_notify_IRQ_sn2(int irq, void *dev_id)
* was received. * was received.
*/ */
static void static void
xpc_check_for_dropped_notify_IRQ_sn2(struct xpc_partition *part) xpc_check_for_dropped_notify_IRQ_sn2(struct timer_list *t)
{ {
struct xpc_partition_sn2 *part_sn2 = &part->sn.sn2; struct xpc_partition *part =
from_timer(part, t, sn.sn2.dropped_notify_IRQ_timer);
if (xpc_part_ref(part)) { if (xpc_part_ref(part)) {
xpc_check_for_sent_chctl_flags_sn2(part); xpc_check_for_sent_chctl_flags_sn2(part);
part_sn2->dropped_notify_IRQ_timer.expires = jiffies + t->expires = jiffies + XPC_DROPPED_NOTIFY_IRQ_WAIT_INTERVAL;
XPC_DROPPED_NOTIFY_IRQ_WAIT_INTERVAL; add_timer(t);
add_timer(&part_sn2->dropped_notify_IRQ_timer);
xpc_part_deref(part); xpc_part_deref(part);
} }
} }
@ -1232,10 +1232,7 @@ xpc_setup_ch_structures_sn2(struct xpc_partition *part)
/* Setup a timer to check for dropped notify IRQs */ /* Setup a timer to check for dropped notify IRQs */
timer = &part_sn2->dropped_notify_IRQ_timer; timer = &part_sn2->dropped_notify_IRQ_timer;
init_timer(timer); timer_setup(timer, xpc_check_for_dropped_notify_IRQ_sn2, 0);
timer->function =
(void (*)(unsigned long))xpc_check_for_dropped_notify_IRQ_sn2;
timer->data = (unsigned long)part;
timer->expires = jiffies + XPC_DROPPED_NOTIFY_IRQ_WAIT_INTERVAL; timer->expires = jiffies + XPC_DROPPED_NOTIFY_IRQ_WAIT_INTERVAL;
add_timer(timer); add_timer(timer);

View File

@ -166,8 +166,8 @@ static unsigned int network_rec_config_shadow = 0;
static unsigned int network_tr_ctrl_shadow = 0; static unsigned int network_tr_ctrl_shadow = 0;
/* Network speed indication. */ /* Network speed indication. */
static DEFINE_TIMER(speed_timer, NULL, 0, 0); static DEFINE_TIMER(speed_timer, NULL);
static DEFINE_TIMER(clear_led_timer, NULL, 0, 0); static DEFINE_TIMER(clear_led_timer, NULL);
static int current_speed; /* Speed read from transceiver */ static int current_speed; /* Speed read from transceiver */
static int current_speed_selection; /* Speed selected by user */ static int current_speed_selection; /* Speed selected by user */
static unsigned long led_next_time; static unsigned long led_next_time;
@ -175,7 +175,7 @@ static int led_active;
static int rx_queue_len; static int rx_queue_len;
/* Duplex */ /* Duplex */
static DEFINE_TIMER(duplex_timer, NULL, 0, 0); static DEFINE_TIMER(duplex_timer, NULL);
static int full_duplex; static int full_duplex;
static enum duplex current_duplex; static enum duplex current_duplex;

View File

@ -4725,9 +4725,9 @@ static const struct net_device_ops qlge_netdev_ops = {
.ndo_vlan_rx_kill_vid = qlge_vlan_rx_kill_vid, .ndo_vlan_rx_kill_vid = qlge_vlan_rx_kill_vid,
}; };
static void ql_timer(unsigned long data) static void ql_timer(struct timer_list *t)
{ {
struct ql_adapter *qdev = (struct ql_adapter *)data; struct ql_adapter *qdev = from_timer(qdev, t, timer);
u32 var = 0; u32 var = 0;
var = ql_read32(qdev, STS); var = ql_read32(qdev, STS);
@ -4806,11 +4806,8 @@ static int qlge_probe(struct pci_dev *pdev,
/* Start up the timer to trigger EEH if /* Start up the timer to trigger EEH if
* the bus goes dead * the bus goes dead
*/ */
init_timer_deferrable(&qdev->timer); timer_setup(&qdev->timer, ql_timer, TIMER_DEFERRABLE);
qdev->timer.data = (unsigned long)qdev; mod_timer(&qdev->timer, jiffies + (5*HZ));
qdev->timer.function = ql_timer;
qdev->timer.expires = jiffies + (5*HZ);
add_timer(&qdev->timer);
ql_link_off(qdev); ql_link_off(qdev);
ql_display_dev_info(ndev); ql_display_dev_info(ndev);
atomic_set(&qdev->lb_count, 0); atomic_set(&qdev->lb_count, 0);

View File

@ -608,9 +608,9 @@ static void tile_net_schedule_egress_timer(struct tile_net_cpu *info)
* ISSUE: Maybe instead track number of expected completions, and free * ISSUE: Maybe instead track number of expected completions, and free
* only that many, resetting to zero if "pending" is ever false. * only that many, resetting to zero if "pending" is ever false.
*/ */
static void tile_net_handle_egress_timer(unsigned long arg) static void tile_net_handle_egress_timer(struct timer_list *t)
{ {
struct tile_net_cpu *info = (struct tile_net_cpu *)arg; struct tile_net_cpu *info = from_timer(info, t, egress_timer);
struct net_device *dev = info->napi.dev; struct net_device *dev = info->napi.dev;
/* The timer is no longer scheduled. */ /* The timer is no longer scheduled. */
@ -1004,9 +1004,8 @@ static void tile_net_register(void *dev_ptr)
BUG(); BUG();
/* Initialize the egress timer. */ /* Initialize the egress timer. */
init_timer_pinned(&info->egress_timer); timer_setup(&info->egress_timer, tile_net_handle_egress_timer,
info->egress_timer.data = (long)info; TIMER_PINNED);
info->egress_timer.function = tile_net_handle_egress_timer;
u64_stats_init(&info->stats.syncp); u64_stats_init(&info->stats.syncp);

View File

@ -157,7 +157,7 @@ static struct net_device *yam_devs[NR_PORTS];
static struct yam_mcs *yam_data; static struct yam_mcs *yam_data;
static DEFINE_TIMER(yam_timer, NULL, 0, 0); static DEFINE_TIMER(yam_timer, NULL);
/* --------------------------------------------------------------------- */ /* --------------------------------------------------------------------- */

View File

@ -2325,9 +2325,9 @@ static netdev_tx_t vxlan_xmit(struct sk_buff *skb, struct net_device *dev)
} }
/* Walk the forwarding table and purge stale entries */ /* Walk the forwarding table and purge stale entries */
static void vxlan_cleanup(unsigned long arg) static void vxlan_cleanup(struct timer_list *t)
{ {
struct vxlan_dev *vxlan = (struct vxlan_dev *) arg; struct vxlan_dev *vxlan = from_timer(vxlan, t, age_timer);
unsigned long next_timer = jiffies + FDB_AGE_INTERVAL; unsigned long next_timer = jiffies + FDB_AGE_INTERVAL;
unsigned int h; unsigned int h;
@ -2647,9 +2647,7 @@ static void vxlan_setup(struct net_device *dev)
INIT_LIST_HEAD(&vxlan->next); INIT_LIST_HEAD(&vxlan->next);
spin_lock_init(&vxlan->hash_lock); spin_lock_init(&vxlan->hash_lock);
init_timer_deferrable(&vxlan->age_timer); timer_setup(&vxlan->age_timer, vxlan_cleanup, TIMER_DEFERRABLE);
vxlan->age_timer.function = vxlan_cleanup;
vxlan->age_timer.data = (unsigned long) vxlan;
vxlan->dev = dev; vxlan->dev = dev;

View File

@ -60,9 +60,9 @@ void ath6kl_recovery_hb_event(struct ath6kl *ar, u32 cookie)
ar->fw_recovery.hb_pending = false; ar->fw_recovery.hb_pending = false;
} }
static void ath6kl_recovery_hb_timer(unsigned long data) static void ath6kl_recovery_hb_timer(struct timer_list *t)
{ {
struct ath6kl *ar = (struct ath6kl *) data; struct ath6kl *ar = from_timer(ar, t, fw_recovery.hb_timer);
int err; int err;
if (test_bit(RECOVERY_CLEANUP, &ar->flag) || if (test_bit(RECOVERY_CLEANUP, &ar->flag) ||
@ -104,9 +104,8 @@ void ath6kl_recovery_init(struct ath6kl *ar)
recovery->seq_num = 0; recovery->seq_num = 0;
recovery->hb_misscnt = 0; recovery->hb_misscnt = 0;
ar->fw_recovery.hb_pending = false; ar->fw_recovery.hb_pending = false;
ar->fw_recovery.hb_timer.function = ath6kl_recovery_hb_timer; timer_setup(&ar->fw_recovery.hb_timer, ath6kl_recovery_hb_timer,
ar->fw_recovery.hb_timer.data = (unsigned long) ar; TIMER_DEFERRABLE);
init_timer_deferrable(&ar->fw_recovery.hb_timer);
if (ar->fw_recovery.hb_poll) if (ar->fw_recovery.hb_poll)
mod_timer(&ar->fw_recovery.hb_timer, jiffies + mod_timer(&ar->fw_recovery.hb_timer, jiffies +

View File

@ -519,7 +519,7 @@ exit:
/* LED trigger */ /* LED trigger */
static int tx_activity; static int tx_activity;
static void at76_ledtrig_tx_timerfunc(unsigned long data); static void at76_ledtrig_tx_timerfunc(unsigned long data);
static DEFINE_TIMER(ledtrig_tx_timer, at76_ledtrig_tx_timerfunc, 0, 0); static DEFINE_TIMER(ledtrig_tx_timer, at76_ledtrig_tx_timerfunc);
DEFINE_LED_TRIGGER(ledtrig_tx); DEFINE_LED_TRIGGER(ledtrig_tx);
static void at76_ledtrig_tx_timerfunc(unsigned long data) static void at76_ledtrig_tx_timerfunc(unsigned long data)

View File

@ -44,10 +44,11 @@ static void parport_ieee1284_wakeup (struct parport *port)
up (&port->physport->ieee1284.irq); up (&port->physport->ieee1284.irq);
} }
static struct parport *port_from_cookie[PARPORT_MAX]; static void timeout_waiting_on_port (struct timer_list *t)
static void timeout_waiting_on_port (unsigned long cookie)
{ {
parport_ieee1284_wakeup (port_from_cookie[cookie % PARPORT_MAX]); struct parport *port = from_timer(port, t, timer);
parport_ieee1284_wakeup (port);
} }
/** /**
@ -69,27 +70,19 @@ static void timeout_waiting_on_port (unsigned long cookie)
int parport_wait_event (struct parport *port, signed long timeout) int parport_wait_event (struct parport *port, signed long timeout)
{ {
int ret; int ret;
struct timer_list timer;
if (!port->physport->cad->timeout) if (!port->physport->cad->timeout)
/* Zero timeout is special, and we can't down() the /* Zero timeout is special, and we can't down() the
semaphore. */ semaphore. */
return 1; return 1;
init_timer_on_stack(&timer); timer_setup(&port->timer, timeout_waiting_on_port, 0);
timer.expires = jiffies + timeout; mod_timer(&port->timer, jiffies + timeout);
timer.function = timeout_waiting_on_port;
port_from_cookie[port->number % PARPORT_MAX] = port;
timer.data = port->number;
add_timer (&timer);
ret = down_interruptible (&port->physport->ieee1284.irq); ret = down_interruptible (&port->physport->ieee1284.irq);
if (!del_timer_sync(&timer) && !ret) if (!del_timer_sync(&port->timer) && !ret)
/* Timed out. */ /* Timed out. */
ret = 1; ret = 1;
destroy_timer_on_stack(&timer);
return ret; return ret;
} }

View File

@ -263,12 +263,12 @@ static int bcm63xx_pcmcia_get_status(struct pcmcia_socket *sock,
/* /*
* socket polling timer callback * socket polling timer callback
*/ */
static void bcm63xx_pcmcia_poll(unsigned long data) static void bcm63xx_pcmcia_poll(struct timer_list *t)
{ {
struct bcm63xx_pcmcia_socket *skt; struct bcm63xx_pcmcia_socket *skt;
unsigned int stat, events; unsigned int stat, events;
skt = (struct bcm63xx_pcmcia_socket *)data; skt = from_timer(skt, t, timer);
spin_lock_bh(&skt->lock); spin_lock_bh(&skt->lock);
@ -392,7 +392,7 @@ static int bcm63xx_drv_pcmcia_probe(struct platform_device *pdev)
sock->map_size = resource_size(skt->common_res); sock->map_size = resource_size(skt->common_res);
/* initialize polling timer */ /* initialize polling timer */
setup_timer(&skt->timer, bcm63xx_pcmcia_poll, (unsigned long)skt); timer_setup(&skt->timer, bcm63xx_pcmcia_poll, 0);
/* initialize pcmcia control register, drive VS[12] to 0, /* initialize pcmcia control register, drive VS[12] to 0,
* leave CB IDSEL to the old value since it is set by the PCI * leave CB IDSEL to the old value since it is set by the PCI

View File

@ -86,9 +86,9 @@ static int bfin_cf_ss_init(struct pcmcia_socket *s)
} }
/* the timer is primarily to kick this socket's pccardd */ /* the timer is primarily to kick this socket's pccardd */
static void bfin_cf_timer(unsigned long _cf) static void bfin_cf_timer(struct timer_list *t)
{ {
struct bfin_cf_socket *cf = (void *)_cf; struct bfin_cf_socket *cf = from_timer(cf, t, timer);
unsigned short present = bfin_cf_present(cf->cd_pfx); unsigned short present = bfin_cf_present(cf->cd_pfx);
if (present != cf->present) { if (present != cf->present) {
@ -227,7 +227,7 @@ static int bfin_cf_probe(struct platform_device *pdev)
cf->cd_pfx = cd_pfx; cf->cd_pfx = cd_pfx;
setup_timer(&cf->timer, bfin_cf_timer, (unsigned long)cf); timer_setup(&cf->timer, bfin_cf_timer, 0);
cf->pdev = pdev; cf->pdev = pdev;
platform_set_drvdata(pdev, cf); platform_set_drvdata(pdev, cf);

View File

@ -875,7 +875,7 @@ static irqreturn_t pcic_interrupt(int irq, void *dev)
return IRQ_RETVAL(handled); return IRQ_RETVAL(handled);
} /* pcic_interrupt */ } /* pcic_interrupt */
static void pcic_interrupt_wrapper(u_long data) static void pcic_interrupt_wrapper(struct timer_list *unused)
{ {
pcic_interrupt(0, NULL); pcic_interrupt(0, NULL);
poll_timer.expires = jiffies + poll_interval; poll_timer.expires = jiffies + poll_interval;
@ -1289,9 +1289,7 @@ static int __init init_i82365(void)
/* Finally, schedule a polling interrupt */ /* Finally, schedule a polling interrupt */
if (poll_interval != 0) { if (poll_interval != 0) {
poll_timer.function = pcic_interrupt_wrapper; timer_setup(&poll_timer, pcic_interrupt_wrapper, 0);
poll_timer.data = 0;
init_timer(&poll_timer);
poll_timer.expires = jiffies + poll_interval; poll_timer.expires = jiffies + poll_interval;
add_timer(&poll_timer); add_timer(&poll_timer);
} }

View File

@ -80,9 +80,9 @@ static int omap_cf_ss_init(struct pcmcia_socket *s)
} }
/* the timer is primarily to kick this socket's pccardd */ /* the timer is primarily to kick this socket's pccardd */
static void omap_cf_timer(unsigned long _cf) static void omap_cf_timer(struct timer_list *t)
{ {
struct omap_cf_socket *cf = (void *) _cf; struct omap_cf_socket *cf = from_timer(cf, t, timer);
unsigned present = omap_cf_present(); unsigned present = omap_cf_present();
if (present != cf->present) { if (present != cf->present) {
@ -102,7 +102,9 @@ static void omap_cf_timer(unsigned long _cf)
*/ */
static irqreturn_t omap_cf_irq(int irq, void *_cf) static irqreturn_t omap_cf_irq(int irq, void *_cf)
{ {
omap_cf_timer((unsigned long)_cf); struct omap_cf_socket *cf = (struct omap_cf_socket *)_cf;
omap_cf_timer(&cf->timer);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
@ -220,7 +222,7 @@ static int __init omap_cf_probe(struct platform_device *pdev)
cf = kzalloc(sizeof *cf, GFP_KERNEL); cf = kzalloc(sizeof *cf, GFP_KERNEL);
if (!cf) if (!cf)
return -ENOMEM; return -ENOMEM;
setup_timer(&cf->timer, omap_cf_timer, (unsigned long)cf); timer_setup(&cf->timer, omap_cf_timer, 0);
cf->pdev = pdev; cf->pdev = pdev;
platform_set_drvdata(pdev, cf); platform_set_drvdata(pdev, cf);

View File

@ -234,9 +234,9 @@ static irqreturn_t pd6729_interrupt(int irq, void *dev)
/* socket functions */ /* socket functions */
static void pd6729_interrupt_wrapper(unsigned long data) static void pd6729_interrupt_wrapper(struct timer_list *t)
{ {
struct pd6729_socket *socket = (struct pd6729_socket *) data; struct pd6729_socket *socket = from_timer(socket, t, poll_timer);
pd6729_interrupt(0, (void *)socket); pd6729_interrupt(0, (void *)socket);
mod_timer(&socket->poll_timer, jiffies + HZ); mod_timer(&socket->poll_timer, jiffies + HZ);
@ -707,8 +707,7 @@ static int pd6729_pci_probe(struct pci_dev *dev,
} }
} else { } else {
/* poll Card status change */ /* poll Card status change */
setup_timer(&socket->poll_timer, pd6729_interrupt_wrapper, timer_setup(&socket->poll_timer, pd6729_interrupt_wrapper, 0);
(unsigned long)socket);
mod_timer(&socket->poll_timer, jiffies + HZ); mod_timer(&socket->poll_timer, jiffies + HZ);
} }

View File

@ -456,9 +456,9 @@ static void soc_common_check_status(struct soc_pcmcia_socket *skt)
} }
/* Let's poll for events in addition to IRQs since IRQ only is unreliable... */ /* Let's poll for events in addition to IRQs since IRQ only is unreliable... */
static void soc_common_pcmcia_poll_event(unsigned long dummy) static void soc_common_pcmcia_poll_event(struct timer_list *t)
{ {
struct soc_pcmcia_socket *skt = (struct soc_pcmcia_socket *)dummy; struct soc_pcmcia_socket *skt = from_timer(skt, t, poll_timer);
debug(skt, 4, "polling for events\n"); debug(skt, 4, "polling for events\n");
mod_timer(&skt->poll_timer, jiffies + SOC_PCMCIA_POLL_PERIOD); mod_timer(&skt->poll_timer, jiffies + SOC_PCMCIA_POLL_PERIOD);
@ -794,8 +794,7 @@ int soc_pcmcia_add_one(struct soc_pcmcia_socket *skt)
skt->cs_state = dead_socket; skt->cs_state = dead_socket;
setup_timer(&skt->poll_timer, soc_common_pcmcia_poll_event, timer_setup(&skt->poll_timer, soc_common_pcmcia_poll_event, 0);
(unsigned long)skt);
skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD; skt->poll_timer.expires = jiffies + SOC_PCMCIA_POLL_PERIOD;
ret = request_resource(&iomem_resource, &skt->res_skt); ret = request_resource(&iomem_resource, &skt->res_skt);

View File

@ -98,7 +98,7 @@ module_param(cycle_time, int, 0444);
/*====================================================================*/ /*====================================================================*/
static irqreturn_t tcic_interrupt(int irq, void *dev); static irqreturn_t tcic_interrupt(int irq, void *dev);
static void tcic_timer(u_long data); static void tcic_timer(struct timer_list *unused);
static struct pccard_operations tcic_operations; static struct pccard_operations tcic_operations;
struct tcic_socket { struct tcic_socket {
@ -435,9 +435,7 @@ static int __init init_tcic(void)
} }
/* Set up polling */ /* Set up polling */
poll_timer.function = &tcic_timer; timer_setup(&poll_timer, &tcic_timer, 0);
poll_timer.data = 0;
init_timer(&poll_timer);
/* Build interrupt mask */ /* Build interrupt mask */
printk(KERN_CONT ", %d sockets\n", sockets); printk(KERN_CONT ", %d sockets\n", sockets);
@ -583,7 +581,7 @@ static irqreturn_t tcic_interrupt(int irq, void *dev)
return IRQ_HANDLED; return IRQ_HANDLED;
} /* tcic_interrupt */ } /* tcic_interrupt */
static void tcic_timer(u_long data) static void tcic_timer(struct timer_list *unused)
{ {
pr_debug("tcic_timer()\n"); pr_debug("tcic_timer()\n");
tcic_timer_pending = 0; tcic_timer_pending = 0;

View File

@ -534,9 +534,9 @@ static irqreturn_t yenta_interrupt(int irq, void *dev_id)
return IRQ_HANDLED; return IRQ_HANDLED;
} }
static void yenta_interrupt_wrapper(unsigned long data) static void yenta_interrupt_wrapper(struct timer_list *t)
{ {
struct yenta_socket *socket = (struct yenta_socket *) data; struct yenta_socket *socket = from_timer(socket, t, poll_timer);
yenta_interrupt(0, (void *)socket); yenta_interrupt(0, (void *)socket);
socket->poll_timer.expires = jiffies + HZ; socket->poll_timer.expires = jiffies + HZ;
@ -1233,8 +1233,7 @@ static int yenta_probe(struct pci_dev *dev, const struct pci_device_id *id)
if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket)) { if (!socket->cb_irq || request_irq(socket->cb_irq, yenta_interrupt, IRQF_SHARED, "yenta", socket)) {
/* No IRQ or request_irq failed. Poll */ /* No IRQ or request_irq failed. Poll */
socket->cb_irq = 0; /* But zero is a valid IRQ number. */ socket->cb_irq = 0; /* But zero is a valid IRQ number. */
setup_timer(&socket->poll_timer, yenta_interrupt_wrapper, timer_setup(&socket->poll_timer, yenta_interrupt_wrapper, 0);
(unsigned long)socket);
mod_timer(&socket->poll_timer, jiffies + HZ); mod_timer(&socket->poll_timer, jiffies + HZ);
dev_info(&dev->dev, dev_info(&dev->dev,
"no PCI IRQ, CardBus support disabled for this socket.\n"); "no PCI IRQ, CardBus support disabled for this socket.\n");

View File

@ -169,11 +169,9 @@ static void cec_mod_timer(struct timer_list *t, unsigned long interval)
mod_timer(t, round_jiffies(iv)); mod_timer(t, round_jiffies(iv));
} }
static void cec_timer_fn(unsigned long data) static void cec_timer_fn(struct timer_list *unused)
{ {
struct ce_array *ca = (struct ce_array *)data; do_spring_cleaning(&ce_arr);
do_spring_cleaning(ca);
cec_mod_timer(&cec_timer, timer_interval); cec_mod_timer(&cec_timer, timer_interval);
} }
@ -510,7 +508,7 @@ void __init cec_init(void)
if (create_debugfs_nodes()) if (create_debugfs_nodes())
return; return;
setup_timer(&cec_timer, cec_timer_fn, (unsigned long)&ce_arr); timer_setup(&cec_timer, cec_timer_fn, 0);
cec_mod_timer(&cec_timer, CEC_TIMER_DEFAULT_INTERVAL); cec_mod_timer(&cec_timer, CEC_TIMER_DEFAULT_INTERVAL);
pr_info("Correctable Errors collector initialized.\n"); pr_info("Correctable Errors collector initialized.\n");

Some files were not shown because too many files have changed in this diff Show More