[S390] Move private simple udelay function to arch/s390/lib/delay.c.
Move cio's private simple udelay function to lib/delay.c and turn it into something much more readable. So we have all implementations at one place. Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com> Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
This commit is contained in:
Родитель
b2300b9efe
Коммит
5a0d0e6537
|
@ -15,6 +15,7 @@
|
||||||
#define _S390_DELAY_H
|
#define _S390_DELAY_H
|
||||||
|
|
||||||
extern void __udelay(unsigned long usecs);
|
extern void __udelay(unsigned long usecs);
|
||||||
|
extern void udelay_simple(unsigned long usecs);
|
||||||
extern void __delay(unsigned long loops);
|
extern void __delay(unsigned long loops);
|
||||||
|
|
||||||
#define udelay(n) __udelay(n)
|
#define udelay(n) __udelay(n)
|
||||||
|
|
|
@ -92,3 +92,16 @@ out:
|
||||||
local_irq_restore(flags);
|
local_irq_restore(flags);
|
||||||
preempt_enable();
|
preempt_enable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Simple udelay variant. To be used on startup and reboot
|
||||||
|
* when the interrupt handler isn't working.
|
||||||
|
*/
|
||||||
|
void udelay_simple(unsigned long usecs)
|
||||||
|
{
|
||||||
|
u64 end;
|
||||||
|
|
||||||
|
end = get_clock() + ((u64) usecs << 12);
|
||||||
|
while (get_clock() < end)
|
||||||
|
cpu_relax();
|
||||||
|
}
|
||||||
|
|
|
@ -859,19 +859,6 @@ __disable_subchannel_easy(struct subchannel_id schid, struct schib *schib)
|
||||||
return -EBUSY; /* uhm... */
|
return -EBUSY; /* uhm... */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* we can't use the normal udelay here, since it enables external interrupts */
|
|
||||||
|
|
||||||
static void udelay_reset(unsigned long usecs)
|
|
||||||
{
|
|
||||||
uint64_t start_cc, end_cc;
|
|
||||||
|
|
||||||
asm volatile ("STCK %0" : "=m" (start_cc));
|
|
||||||
do {
|
|
||||||
cpu_relax();
|
|
||||||
asm volatile ("STCK %0" : "=m" (end_cc));
|
|
||||||
} while (((end_cc - start_cc)/4096) < usecs);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int
|
static int
|
||||||
__clear_io_subchannel_easy(struct subchannel_id schid)
|
__clear_io_subchannel_easy(struct subchannel_id schid)
|
||||||
{
|
{
|
||||||
|
@ -887,7 +874,7 @@ __clear_io_subchannel_easy(struct subchannel_id schid)
|
||||||
if (schid_equal(&ti.schid, &schid))
|
if (schid_equal(&ti.schid, &schid))
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
udelay_reset(100);
|
udelay_simple(100);
|
||||||
}
|
}
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
}
|
}
|
||||||
|
@ -895,7 +882,7 @@ __clear_io_subchannel_easy(struct subchannel_id schid)
|
||||||
static void __clear_chsc_subchannel_easy(void)
|
static void __clear_chsc_subchannel_easy(void)
|
||||||
{
|
{
|
||||||
/* It seems we can only wait for a bit here :/ */
|
/* It seems we can only wait for a bit here :/ */
|
||||||
udelay_reset(100);
|
udelay_simple(100);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pgm_check_occured;
|
static int pgm_check_occured;
|
||||||
|
|
Загрузка…
Ссылка в новой задаче