rk_tsadc breaks (my) Rock64
Peter Jeremy
peter at rulingia.com
Tue Dec 3 10:14:46 UTC 2019
On 2019-Dec-02 15:45:48 +0100, Emmanuel Vadot <manu at bidouilliste.com> wrote:
>> >> Firstly, I've found that the syscon at ff100000 FDT entry attaches as two
>> >> distinct devices:
>> >> rk_grf0: <RockChip General Register Files> mem 0xff100000-0xff100fff on ofwbus0
>> >> (via compatible = "rockchip,rk3328-grf")
>> >> simple_mfd0: <Simple MFD (Multi-Functions Device)> mem 0xff450000-0xff45ffff on ofwbus0
>> >> (via compatible = "simple-mfd")
>> >
>> > ??? those aren't the same devices.
Yes. Looking more closely, I was wrong. There are 2 GRF devices in
the RK3328 that probe/attach separately.
> This isn't enough, RK3328 initialization is V2 but needs the
>AUTO_Q_SEL bit too (like v3). There might be other stuff that I
>haven't found yet.
> That still doesn't explain why it's working for me (both DEBUG and
>NODEBUG kernels).
I don't understand how the SYSCON_WRITE_4() operations can work when
the offsets are outside the memory range allocated to the device.
The other oddity I have is that Rockchip_RK3328TRM_V1.1-Part1-20170321.pdf
Table 9-1 (the Temperature-to-code mapping table) is identical to
rk3288_calib_data and looks completely different to rk3328_calib_data.
(Looking more closely, the values in the two tables sum to 4096).
I've tried the following, slightly more extensive patch and now get
temperature readings that aren't insane (~40°C idle and ~52°C under
heavy FPU load, at 1200MHz with a small heatsink and active airflow).
I haven't worked through the TRM in detail to see if there's anything
else missing.
Index: rk_tsadc.c
===================================================================
--- rk_tsadc.c (revision 355286)
+++ rk_tsadc.c (working copy)
@@ -98,11 +98,6 @@
int channel;
};
-enum tsadc_type {
- RK_TSADC_V2,
- RK_TSADC_V3
-};
-
struct rk_calib_entry {
uint32_t raw;
int temp;
@@ -109,13 +104,14 @@
};
struct tsadc_calib_info {
- bool decrement_mode;
+ //bool decrement_mode;
struct rk_calib_entry *table;
int nentries;
};
struct tsadc_conf {
- enum tsadc_type type;
+ int use_syscon;
+ int q_sel_ntc;
int shutdown_temp;
int shutdown_mode;
int shutdown_pol;
@@ -188,7 +184,8 @@
};
struct tsadc_conf rk3288_tsadc_conf = {
- .type = RK_TSADC_V2,
+ .use_syscon= 0,
+ .q_sel_ntc= 0,
.shutdown_temp = 95000,
.shutdown_mode = 1, /* GPIO */
.shutdown_pol = 0, /* Low */
@@ -241,7 +238,8 @@
};
static struct tsadc_conf rk3328_tsadc_conf = {
- .type = RK_TSADC_V3,
+ .use_syscon= 0,
+ .q_sel_ntc= 1,
.shutdown_temp = 95000,
.shutdown_mode = 0, /* CRU */
.shutdown_pol = 0, /* Low */
@@ -296,7 +294,8 @@
};
static struct tsadc_conf rk3399_tsadc_conf = {
- .type = RK_TSADC_V3,
+ .use_syscon= 1,
+ .q_sel_ntc= 1,
.shutdown_temp = 95000,
.shutdown_mode = 1, /* GPIO */
.shutdown_pol = 0, /* Low */
@@ -444,11 +443,11 @@
val |= TSADC_AUTO_CON_POL_HI;
else
val &= ~TSADC_AUTO_CON_POL_HI;
- if (sc->conf->type == RK_TSADC_V3)
+ if (sc->conf->q_sel_ntc)
val |= TSADC_AUTO_Q_SEL;
WR4(sc, TSADC_AUTO_CON, val);
- if (sc->conf->type == RK_TSADC_V2) {
+ if (!sc->conf->use_syscon) {
/* V2 init */
WR4(sc, TSADC_AUTO_PERIOD, 250); /* 250 ms */
WR4(sc, TSADC_AUTO_PERIOD_HT, 50); /* 50 ms */
--
Peter Jeremy
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 963 bytes
Desc: not available
URL: <http://lists.freebsd.org/pipermail/freebsd-arm/attachments/20191203/09f7a7e2/attachment.sig>
More information about the freebsd-arm
mailing list