linux-arm-kernel.lists.infradead.org archive mirror
 help / color / mirror / Atom feed
* a case for a common efuse API?
@ 2014-07-08 20:00 Stephen Boyd
  2014-07-08 20:26 ` Olof Johansson
                   ` (6 more replies)
  0 siblings, 7 replies; 16+ messages in thread
From: Stephen Boyd @ 2014-07-08 20:00 UTC (permalink / raw)
  To: linux-arm-kernel

Hi,

On MSM chips we have some efuses (called qfprom) where we store things
like calibration data, speed bins, etc. We need to read out data from
the efuses in various drivers like the cpufreq, thermal, etc. This
essentially boils down to a bunch of readls on the efuse from a handful
of different drivers. In devicetree this looks a little odd because
these drivers end up having an extra reg property (or two) that points
to a register in the efuse and some length, i.e you see this:

	thermal-sensor at 34000 {
		compatible = "sensor";
		reg = <0x34000 0x1000>, <0x10018 0xc>;
		reg-names = "sensor", "efuse_calib";
	}


I imagine in DT we want something more like this:

	efuse: efuse at 10000 {
		compatible = "efuse";
		reg = <0x10000 0x1000>;
	}

	thermal-sensor at 34000 {
		compatible = "sensor";
		reg = <0x34000 0x1000>;
		efuse = <&efuse 0x18>;
	}


Where we can point to the efuse and give an address offset. From code we
could then call some efuse_read() function to read the sensor's
calibration data.

It's been suggested that we use syscon for this, but I wonder if that is
the right thing to do. With a syscon you're usually writing some
registers that got lumped together with other registers that aren't
directly related to your driver. It doesn't seem like syscon is made for
reading fuses or other things like eeproms. Maybe I'm wrong though.

Using syscon would probably work if we could add a way to point to
offsets within the syscon node (the 0x18 part in the example). In my
specific use-case the calibration data may have different offsets
depending on which SoC the hardware is instantiated in so we could also
make syscon work if the compatible field for the sensor node indicates
which SoC it is.

I added Tegra folks because I see that on Tegra this hardware is exposed
via an SoC specific API, tegra_fuse_readl(), and an associated driver in
drivers/misc/fuse/tegra/. Unfortunately I don't see any users of the API
outside of the speedo code in the same directory and the sysfs bin
attribute that may or may not be in use by some userspace code.

-- 
Qualcomm Innovation Center, Inc. is a member of Code Aurora Forum,
hosted by The Linux Foundation

^ permalink raw reply	[flat|nested] 16+ messages in thread

end of thread, other threads:[~2014-09-16 10:16 UTC | newest]

Thread overview: 16+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2014-07-08 20:00 a case for a common efuse API? Stephen Boyd
2014-07-08 20:26 ` Olof Johansson
2014-07-08 21:59 ` Bjorn Andersson
2014-07-09  7:24 ` Uwe Kleine-König
2014-07-09  7:50 ` Srinivas Kandagatla
2014-07-09  8:35 ` Maxime Ripard
2014-07-09 23:32   ` Stephen Boyd
2014-07-10 14:26     ` Maxime Ripard
2014-07-10 15:18       ` Alexandre Belloni
2014-07-10 15:41       ` Grygorii Strashko
2014-07-10 15:09         ` Maxime Ripard
2014-09-11 21:59       ` Stephen Boyd
2014-09-16 10:16         ` Maxime Ripard
2014-07-09 11:49 ` Peter De Schrijver
2014-07-21 15:51   ` Stephen Warren
2014-07-09 20:42 ` Tomasz Figa

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).