Message ID | 1479922177-20136-1-git-send-email-al.kochet@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Hi Alexander, I haven't looked to deep into your patches yet, but what is missing is the general goal of your whole series. git format-patch has this nice "--cover-letter" option that creates obviously a cover-letter where you can describe what your series wants to achieve. For those reading along, I guess what you want to achieve should be what I describe below, so of course no need to resend just for this :-) ----- The clock supplying the arm-global-timer on the rk3188 is coming from the the cpu clock itself and thus changes its rate everytime cpufreq adjusts the cpu frequency making this timer unsuitable as a stable clocksource. The rk3188, rk3288 and following socs share a separate timer block already handled by the rockchip-timer driver. Therefore adapt this driver to also be able to act as clocksource on rk3188. ----- Right? Heiko Am Mittwoch, 23. November 2016, 20:29:29 schrieb Alexander Kochetkov: > Move ce field out of struct bc_timer into struct rk_clock_event_device, > rename struct bc_timer to struct rk_timer. > > Signed-off-by: Alexander Kochetkov <al.kochet@gmail.com>
Hello Heiko, > I haven't looked to deep into your patches yet, but what is missing is the > general goal of your whole series. I will be very grateful to receive feedback > 24 нояб. 2016 г., в 15:01, Heiko Stübner <heiko@sntech.de> написал(а): > > git format-patch has this nice "--cover-letter" option that creates obviously > a cover-letter where you can describe what your series wants to achieve. > I’ve used --cover-letter option but forget to add message text. Just subject. So all patches was sent without cover letter. I’ll be careful next time. > For those reading along, I guess what you want to achieve should be what I > describe below, so of course no need to resend just for this :-) > > ----- > The clock supplying the arm-global-timer on the rk3188 is coming from the > the cpu clock itself and thus changes its rate everytime cpufreq adjusts the > cpu frequency making this timer unsuitable as a stable clocksource. > > The rk3188, rk3288 and following socs share a separate timer block already > handled by the rockchip-timer driver. Therefore adapt this driver to also be > able to act as clocksource on rk3188. > ----- > > Right? Yes, exactly as you wrote. Regards, Alexander.
diff --git a/drivers/clocksource/rockchip_timer.c b/drivers/clocksource/rockchip_timer.c index 23e267a..6d68d4c 100644 --- a/drivers/clocksource/rockchip_timer.c +++ b/drivers/clocksource/rockchip_timer.c @@ -29,18 +29,28 @@ #define TIMER_MODE_USER_DEFINED_COUNT (1 << 1) #define TIMER_INT_UNMASK (1 << 2) -struct bc_timer { - struct clock_event_device ce; +struct rk_timer { void __iomem *base; void __iomem *ctrl; u32 freq; }; -static struct bc_timer bc_timer; +struct rk_clock_event_device { + struct clock_event_device ce; + struct rk_timer timer; +}; + +static struct rk_clock_event_device bc_timer; + +static inline struct rk_clock_event_device* +rk_clock_event_device(struct clock_event_device *ce) +{ + return container_of(ce, struct rk_clock_event_device, ce); +} -static inline struct bc_timer *rk_timer(struct clock_event_device *ce) +static inline struct rk_timer *rk_timer(struct clock_event_device *ce) { - return container_of(ce, struct bc_timer, ce); + return &rk_clock_event_device(ce)->timer; } static inline void __iomem *rk_base(struct clock_event_device *ce) @@ -116,16 +126,17 @@ static irqreturn_t rk_timer_interrupt(int irq, void *dev_id) static int __init rk_timer_init(struct device_node *np, u32 ctrl_reg) { struct clock_event_device *ce = &bc_timer.ce; + struct rk_timer *timer = &bc_timer.timer; struct clk *timer_clk; struct clk *pclk; int ret = -EINVAL, irq; - bc_timer.base = of_iomap(np, 0); - if (!bc_timer.base) { + timer->base = of_iomap(np, 0); + if (!timer->base) { pr_err("Failed to get base address for '%s'\n", TIMER_NAME); return -ENXIO; } - bc_timer.ctrl = bc_timer.base + ctrl_reg; + timer->ctrl = timer->base + ctrl_reg; pclk = of_clk_get_by_name(np, "pclk"); if (IS_ERR(pclk)) { @@ -153,7 +164,7 @@ static int __init rk_timer_init(struct device_node *np, u32 ctrl_reg) goto out_timer_clk; } - bc_timer.freq = clk_get_rate(timer_clk); + timer->freq = clk_get_rate(timer_clk); irq = irq_of_parse_and_map(np, 0); if (!irq) { @@ -181,7 +192,7 @@ static int __init rk_timer_init(struct device_node *np, u32 ctrl_reg) goto out_irq; } - clockevents_config_and_register(ce, bc_timer.freq, 1, UINT_MAX); + clockevents_config_and_register(ce, timer->freq, 1, UINT_MAX); return 0; @@ -190,7 +201,7 @@ out_irq: out_timer_clk: clk_disable_unprepare(pclk); out_unmap: - iounmap(bc_timer.base); + iounmap(timer->base); return ret; }
Move ce field out of struct bc_timer into struct rk_clock_event_device, rename struct bc_timer to struct rk_timer. Signed-off-by: Alexander Kochetkov <al.kochet@gmail.com> --- drivers/clocksource/rockchip_timer.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-)