[PATCH 2/5] ARM: s3c64xx: Add generic high resolution time support using PWM timers.
Russell King - ARM Linux
linux at arm.linux.org.uk
Thu Oct 13 10:22:41 EDT 2011
On Wed, Aug 31, 2011 at 02:34:52PM +0200, Tomasz Figa wrote:
> +/*
> + * Clock source
> + */
> +
> +static struct clk *source_in;
> +static struct clk *source_div;
> +
> +static cycle_t s3c64xx_clocksource_read(struct clocksource *cs)
> +{
> + return (cycle_t) ~__raw_readl(S3C2410_TCNTO(PWM_SOURCE));
> +}
This looks like a very simple MMIO clocksource... This looks the
same as clocksource_mmio_readl_down().
> +
> +static void s3c64xx_clocksource_resume(struct clocksource *cs)
> +{
> + unsigned long pclk;
> + struct clk *tscaler;
> +
> + pclk = clk_get_rate(timerclk);
> + tscaler = clk_get_parent(source_div);
> + clk_set_rate(tscaler, pclk / 3);
> +
> + clk_set_rate(source_div, pclk / 6);
> + clk_set_parent(source_in, source_div);
> +
> + s3c64xx_pwm_init(PWM_SOURCE, TCNT_MAX);
> + s3c64xx_pwm_start(PWM_SOURCE, PERIODIC);
> +}
> +
> +static struct clocksource pwm_clocksource = {
> + .name = "s3c64xx_clksrc",
> + .rating = 250,
> + .read = s3c64xx_clocksource_read,
> + .mask = CLOCKSOURCE_MASK(32),
> + .flags = CLOCK_SOURCE_IS_CONTINUOUS,
> + .resume = s3c64xx_clocksource_resume,
> +};
> +
> +static void __init s3c64xx_clocksource_init(void)
> +{
> + unsigned long clock_rate;
> +
> + clock_rate = clk_get_rate(source_in);
> +
> + s3c64xx_pwm_init(PWM_SOURCE, TCNT_MAX);
> + s3c64xx_pwm_start(PWM_SOURCE, PERIODIC);
> +
> + if (clocksource_register_hz(&pwm_clocksource, clock_rate))
> + panic("%s: can't register clocksource\n", pwm_clocksource.name);
Apart from the resume entry, this looks like it could use
drivers/clocksource/mmio.c - and so avoid yet another clocksource
creation.
Maybe adding some kind of resume support to mmio.c would be a good
idea?
More information about the linux-arm-kernel
mailing list