* Peter Keilty (peter.keilty@xxxxxx) wrote: > diff --git a/drivers/acpi/processor_idle.c b/drivers/acpi/processor_idle.c > index 6077300..35ad71f 100644 > --- a/drivers/acpi/processor_idle.c > +++ b/drivers/acpi/processor_idle.c > @@ -480,10 +480,12 @@ #endif > /* Get end time (ticks) */ > t2 = inl(acpi_gbl_FADT.xpm_timer_block.address); > > +#ifndef CONFIG_IA64 > #ifdef CONFIG_GENERIC_TIME > /* TSC halts in C2, so notify users */ > mark_tsc_unstable(); > #endif > +#endif Is this a better description of the dependency? #if defined (CONFIG_GENERIC_TIME) && defined (CONFIG_X86_TSC) > /* Re-enable interrupts */ > local_irq_enable(); > current_thread_info()->status |= TS_POLLING; > @@ -522,10 +524,12 @@ #endif > acpi_set_register(ACPI_BITREG_ARB_DISABLE, 0); > } > > +#ifndef CONFIG_IA64 > #ifdef CONFIG_GENERIC_TIME > /* TSC halts in C3, so notify users */ > mark_tsc_unstable(); > #endif > +#endif ditto > /* Re-enable interrupts */ > local_irq_enable(); > current_thread_info()->status |= TS_POLLING; > diff --git a/drivers/char/hpet.c b/drivers/char/hpet.c > index 0be700f..5ea7d3e 100644 > --- a/drivers/char/hpet.c > +++ b/drivers/char/hpet.c > @@ -29,6 +29,7 @@ #include <linux/wait.h> > #include <linux/bcd.h> > #include <linux/seq_file.h> > #include <linux/bitops.h> > +#include <linux/clocksource.h> > > #include <asm/current.h> > #include <asm/uaccess.h> > @@ -51,8 +52,34 @@ #define HPET_DRIFT (500) > > #define HPET_RANGE_SIZE 1024 /* from HPET spec */ > > +#if BITS_PER_LONG == 64 > +#define write_counter(V, MC) writeq(V, MC) > +#define read_counter(MC) readq(MC) > +#else > +#define write_counter(V, MC) writel(V, MC) > +#define read_counter(MC) readl(MC) > +#endif > + > static u32 hpet_nhpet, hpet_max_freq = HPET_USER_FREQ; > > +static void __iomem *hpet_mc_ptr; CodingStyle nit: we don't need all this _ptr... > +static cycle_t read_hpet(void) > +{ > + return (cycle_t)read_counter((void __iomem *)hpet_mc_ptr); > +} > + > +static struct clocksource clocksource_hpet = { > + .name = "hpet", > + .rating = 300, > + .read = read_hpet, > + .mask = 0xffffffffffffffffLL, > + .mult = 0, /*to be caluclated*/ > + .shift = 10, > + .is_continuous = 1, > +}; > +static struct clocksource *hpet_clocksource_p; and _p naming. > + > /* A lock for concurrent access by app and isr hpet activity. */ > static DEFINE_SPINLOCK(hpet_lock); > /* A lock for concurrent intermodule access to hpet and isr hpet activity. */ > @@ -79,7 +106,7 @@ struct hpets { > struct hpets *hp_next; > struct hpet __iomem *hp_hpet; > unsigned long hp_hpet_phys; > - struct time_interpolator *hp_interpolator; > + struct clocksource *hp_clocksource; > unsigned long long hp_tick_freq; > unsigned long hp_delta; > unsigned int hp_ntimer; > @@ -94,13 +121,6 @@ #define HPET_IE 0x0002 /* interrupt en > #define HPET_PERIODIC 0x0004 > #define HPET_SHARED_IRQ 0x0008 > > -#if BITS_PER_LONG == 64 > -#define write_counter(V, MC) writeq(V, MC) > -#define read_counter(MC) readq(MC) > -#else > -#define write_counter(V, MC) writel(V, MC) > -#define read_counter(MC) readl(MC) > -#endif > > #ifndef readq > static inline unsigned long long readq(void __iomem *addr) > @@ -737,27 +757,6 @@ static ctl_table dev_root[] = { > > static struct ctl_table_header *sysctl_header; > > -static void hpet_register_interpolator(struct hpets *hpetp) > -{ > -#ifdef CONFIG_TIME_INTERPOLATION > - struct time_interpolator *ti; > - > - ti = kzalloc(sizeof(*ti), GFP_KERNEL); > - if (!ti) > - return; > - > - ti->source = TIME_SOURCE_MMIO64; > - ti->shift = 10; > - ti->addr = &hpetp->hp_hpet->hpet_mc; > - ti->frequency = hpetp->hp_tick_freq; > - ti->drift = HPET_DRIFT; > - ti->mask = -1; > - > - hpetp->hp_interpolator = ti; > - register_time_interpolator(ti); > -#endif > -} > - > /* > * Adjustment for when arming the timer with > * initial conditions. That is, main counter > @@ -909,7 +908,14 @@ int hpet_alloc(struct hpet_data *hdp) > } > > hpetp->hp_delta = hpet_calibrate(hpetp); > - hpet_register_interpolator(hpetp); > + > + if (!hpet_clocksource_p) { > + clocksource_hpet.fsys_mmio_ptr = hpet_mc_ptr = &hpetp->hp_hpet->hpet_mc; > + clocksource_hpet.mult = clocksource_hz2mult(hpetp->hp_tick_freq, > + clocksource_hpet.shift); > + clocksource_register(&clocksource_hpet); > + hpet_clocksource_p = hpetp->hp_clocksource = &clocksource_hpet; > + } This looks like a change in behaviour for non-ia64. Now i386 and x86_64 will get this clocksource twice (and this one has a higher rating). Doesn't look like this will even compile since fsys_mmio_ptr (more extraneous _ptr suffix) is ia64 only? And sparc64 is left out in the cold. > return 0; > } > @@ -995,7 +1001,7 @@ static int hpet_acpi_add(struct acpi_dev > > static int hpet_acpi_remove(struct acpi_device *device, int type) > { > - /* XXX need to unregister interpolator, dealloc mem, etc */ > + /* XXX need to unregister clocksource, dealloc mem, etc */ > return -EINVAL; > } > > diff --git a/include/linux/clocksource.h b/include/linux/clocksource.h > index daa4940..a20b4d6 100644 > --- a/include/linux/clocksource.h > +++ b/include/linux/clocksource.h > @@ -61,6 +61,9 @@ struct clocksource { > u32 shift; > unsigned long flags; > cycle_t (*vread)(void); > +#ifdef CONFIG_IA64 > + void *fsys_mmio_ptr; /* used by fsyscall asm code */ > +#endif > > /* timekeeping specific data, ignore */ > cycle_t cycle_last, cycle_interval; - To unsubscribe from this list: send the line "unsubscribe linux-ia64" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html
![]() |