All of lore.kernel.org
 help / color / mirror / Atom feed
From: Paul Cercueil <paul@crapouillou.net>
To: Thierry Reding <thierry.reding@gmail.com>
Cc: "Daniel Lezcano" <daniel.lezcano@linaro.org>,
	"Thomas Gleixner" <tglx@linutronix.de>,
	"Ralf Baechle" <ralf@linux-mips.org>,
	"Paul Burton" <paul.burton@mips.com>,
	"James Hogan" <jhogan@kernel.org>,
	"Jonathan Corbet" <corbet@lwn.net>,
	"Uwe Kleine-König" <u.kleine-koenig@pengutronix.de>,
	"Mathieu Malaterre" <malat@debian.org>,
	od@zcrc.me, linux-pwm@vger.kernel.org,
	devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
	linux-watchdog@vger.kernel.org, linux-mips@vger.kernel.org,
	linux-doc@vger.kernel.org, linux-clk@vger.kernel.org
Subject: Re: [PATCH v10 04/27] clocksource: Add a new timer-ingenic driver
Date: Mon, 11 Mar 2019 17:52:07 -0300	[thread overview]
Message-ID: <1552337527.24876.0@crapouillou.net> (raw)
In-Reply-To: <20190308102225.GC22655@ulmo>

Hi Thierry,

Le ven. 8 mars 2019 à 7:22, Thierry Reding <thierry.reding@gmail.com> 
a écrit :
> On Mon, Mar 04, 2019 at 07:13:05PM +0100, Paul Cercueil wrote:
>>  Hi Thierry,
>> 
>>  On Mon, Mar 4, 2019 at 1:22 PM, Thierry Reding 
>> <thierry.reding@gmail.com>
>>  wrote:
>>  > On Sat, Mar 02, 2019 at 08:33:50PM -0300, Paul Cercueil wrote:
>>  > [...]
>>  > >  diff --git a/drivers/clocksource/ingenic-timer.c
>>  > > b/drivers/clocksource/ingenic-timer.c
> [...]
>>  > >  +static u64 notrace ingenic_tcu_timer_read(void)
>>  > >  +{
>>  > >  +	unsigned int channel = ingenic_tcu->cs_channel;
>>  > >  +	u16 count;
>>  > >  +
>>  > >  +	count = readw(ingenic_tcu_base + TCU_REG_TCNTc(channel));
>>  >
>>  > Can't yo do this via the regmap?
>> 
>>  I could, but for the sched_clock to be precise the function must 
>> return
>>  as fast as possible. That's the rationale behind the use of readw() 
>> here.
>> 
>>  That's also the reason why ingenic_tcu_base is global and exported, 
>> so
>>  that the OS Timer driver can use it as well.
> 
> Is the path through the regmap really significantly slower than the
> direct register access? Anyway, if you need the global anyway, might 
> as
> well use it.

About 10% slower.

> [...]
>>  > >  +	// Register the sched_clock at the very end as there's no 
>> way to
>>  > > undo it
>>  > >  +	rate = clk_get_rate(tcu->cs_clk);
>>  > >  +	sched_clock_register(ingenic_tcu_timer_read, 16, rate);
>>  >
>>  > Oh wow... so you managed to nicely encapsulate everything and now 
>> this
>>  > seems to be the only reason why you need to rely on global 
>> variables.
>>  >
>>  > That's unfortunate. I suppose we could go and add a void *data 
>> parameter
>>  > to sched_clock_register() and pass that to the read() function. 
>> That way
>>  > you could make this completely independent of global variables, 
>> but
>>  > there are 73 callers of sched_clock_register() and they are 
>> spread all
>>  > over the place, so sounds a bit daunting to me.
>> 
>>  Yes, that's the main reason behind the use of a global variables.
>>  Is there a way we could introduce another callback, e.g. 
>> .read_value(),
>>  that would receive a void *param? Then the current .read() callback
>>  can be deprecated and the 73 callers can be migrated later.
> 
> Yeah, I suppose that would be possible. I'll defer to Daniel and 
> Thomas
> on this. They may not consider this important enough.
> 
>>  > >  +
>>  > >  +	return 0;
>>  > >  +
>>  > >  +err_tcu_clocksource_cleanup:
>>  > >  +	ingenic_tcu_clocksource_cleanup(tcu);
>>  > >  +err_tcu_clk_cleanup:
>>  > >  +	ingenic_tcu_clk_cleanup(tcu, np);
>>  > >  +err_tcu_intc_cleanup:
>>  > >  +	ingenic_tcu_intc_cleanup(tcu);
>>  > >  +err_clk_disable:
>>  > >  +	clk_disable_unprepare(tcu->clk);
>>  > >  +err_clk_put:
>>  > >  +	clk_put(tcu->clk);
>>  > >  +err_free_regmap:
>>  > >  +	regmap_exit(tcu->map);
>>  > >  +err_iounmap:
>>  > >  +	iounmap(base);
>>  > >  +	release_mem_region(res.start, resource_size(&res));
>>  > >  +err_free_ingenic_tcu:
>>  > >  +	kfree(tcu);
>>  > >  +	return ret;
>>  > >  +}
>>  > >  +
>>  > >  +TIMER_OF_DECLARE(jz4740_tcu_intc,  "ingenic,jz4740-tcu",
>>  > > ingenic_tcu_init);
>>  > >  +TIMER_OF_DECLARE(jz4725b_tcu_intc, "ingenic,jz4725b-tcu",
>>  > > ingenic_tcu_init);
>>  > >  +TIMER_OF_DECLARE(jz4770_tcu_intc,  "ingenic,jz4770-tcu",
>>  > > ingenic_tcu_init);
>>  > >  +
>>  > >  +
>>  > >  +static int __init ingenic_tcu_probe(struct platform_device 
>> *pdev)
>>  > >  +{
>>  > >  +	platform_set_drvdata(pdev, ingenic_tcu);
>>  >
>>  > Then there's also this. Oh well... nevermind then.
>> 
>>  The content of ingenic_tcu_platform_init() could be moved inside
>>  ingenic_tcu_init(). But can we get a hold of the struct device 
>> before the
>>  probe function is called? That would allow to set the drvdata and 
>> regmap
>>  without relying on global state.
> 
> I'm not sure if the driver core is ready at this point. It's likely it
> isn't, otherwise there'd be no need for TIMER_OF_DECLARE(), really. I
> also vaguely recall looking into this a few years ago because of some
> similar work I was but I eventually gave up because I couldn't find a
> way that would allow both the code to execute early enough and still
> use the regular driver model.
> 
> Platform device become available at arch_initcall_sync (3s), while the
> TIMER_OF_DECLARE code runs way earlier than any of the initcalls, so I
> don't think there's a way to do it. Unless perhaps if the timers can
> be initialized later. I'm not sure if that's possible, and might not 
> be
> worth it just for the sake of being pedantic.
> 
> Thierry

I think for the time being I can't really go around using the global 
variables.
Hopefully that's something that can be fixed in the future.

-Paul


  reply	other threads:[~2019-03-11 20:52 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-03-02 23:33 [5.2][PATCH v10 00/27] Ingenic TCU patchset Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 01/27] dt-bindings: ingenic: Add DT bindings for TCU clocks Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 02/27] doc: Add doc for the Ingenic TCU hardware Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 03/27] dt-bindings: Add doc for the Ingenic TCU drivers Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 04/27] clocksource: Add a new timer-ingenic driver Paul Cercueil
2019-03-04 12:22   ` Thierry Reding
2019-03-04 18:13     ` Paul Cercueil
2019-03-08 10:22       ` Thierry Reding
2019-03-11 20:52         ` Paul Cercueil [this message]
2019-03-05  3:15   ` kbuild test robot
2019-03-05  3:15     ` kbuild test robot
2019-03-02 23:33 ` [PATCH v10 05/27] clocksource: Add driver for the Ingenic JZ47xx OST Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 06/27] MAINTAINERS: Add myself as maintainer for Ingenic TCU drivers Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 07/27] watchdog: jz4740: Use WDT clock provided by TCU driver Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 08/27] watchdog: jz4740: Use regmap " Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 09/27] watchdog: jz4740: Avoid starting watchdog in set_timeout Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 10/27] watchdog: jz4740: Drop dependency on MACH_JZ47xx, use COMPILE_TEST Paul Cercueil
2019-03-02 23:33 ` [PATCH v10 11/27] pwm: jz4740: Apply configuration atomically Paul Cercueil
2019-03-04 11:59   ` Thierry Reding
2019-03-02 23:33 ` [PATCH v10 12/27] pwm: jz4740: Use regmap from TCU driver Paul Cercueil
2019-03-04 12:24   ` Thierry Reding
2019-03-02 23:33 ` [PATCH v10 13/27] pwm: jz4740: Use clocks " Paul Cercueil
2019-03-04 12:30   ` Thierry Reding
2019-03-04 18:18     ` Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 14/27] pwm: jz4740: Improve algorithm of clock calculation Paul Cercueil
2019-03-04 12:33   ` Thierry Reding
2019-03-02 23:34 ` [PATCH v10 15/27] pwm: jz4740: Allow selection of PWM channels 0 and 1 Paul Cercueil
2019-03-04 12:34   ` Thierry Reding
2019-03-02 23:34 ` [PATCH v10 16/27] pwm: jz4740: Drop dependency on MACH_INGENIC, use COMPILE_TEST Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 17/27] pwm: jz4740: Remove unused devicetree compatible strings Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 18/27] clk: jz4740: Add TCU clock Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 19/27] MIPS: Kconfig: Select TCU timer driver when MACH_INGENIC is set Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 20/27] MIPS: jz4740: Add DTS nodes for the TCU drivers Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 21/27] MIPS: qi_lb60: Move PWM devices to devicetree Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 22/27] MIPS: qi_lb60: Reduce system timer and clocksource to 750 kHz Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 23/27] MIPS: CI20: Reduce system timer and clocksource to 3 MHz Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 24/27] MIPS: CI20: defconfig: enable OST driver Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 25/27] MIPS: GCW0: Reduce system timer and clocksource to 750 kHz Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 26/27] MIPS: GCW0: defconfig: Enable OST, watchdog, PWM drivers Paul Cercueil
2019-03-02 23:34 ` [PATCH v10 27/27] MIPS: jz4740: Drop obsolete code Paul Cercueil

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1552337527.24876.0@crapouillou.net \
    --to=paul@crapouillou.net \
    --cc=corbet@lwn.net \
    --cc=daniel.lezcano@linaro.org \
    --cc=devicetree@vger.kernel.org \
    --cc=jhogan@kernel.org \
    --cc=linux-clk@vger.kernel.org \
    --cc=linux-doc@vger.kernel.org \
    --cc=linux-kernel@vger.kernel.org \
    --cc=linux-mips@vger.kernel.org \
    --cc=linux-pwm@vger.kernel.org \
    --cc=linux-watchdog@vger.kernel.org \
    --cc=malat@debian.org \
    --cc=od@zcrc.me \
    --cc=paul.burton@mips.com \
    --cc=ralf@linux-mips.org \
    --cc=tglx@linutronix.de \
    --cc=thierry.reding@gmail.com \
    --cc=u.kleine-koenig@pengutronix.de \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.