diff options
author | Gavin Shan <gwshan@linux.vnet.ibm.com> | 2015-11-12 13:33:08 +1100 |
---|---|---|
committer | Stewart Smith <stewart@linux.vnet.ibm.com> | 2016-03-08 18:18:28 +1100 |
commit | 5cda6f6de5af22b7602901584b6eeca099e50b20 (patch) | |
tree | cd50d95ca6833049a896bf557cbb29f6c1b7e015 /hdata/spira.c | |
parent | 5326c45da779e6fca849a0b17f6fe61b25e528b7 (diff) | |
download | skiboot-5cda6f6de5af22b7602901584b6eeca099e50b20.zip skiboot-5cda6f6de5af22b7602901584b6eeca099e50b20.tar.gz skiboot-5cda6f6de5af22b7602901584b6eeca099e50b20.tar.bz2 |
platforms/firenze: Fix I2C clock source frequency
The I2C master clock source frequency is hardcoded to wrong value.
The correct frequency should be the nest clock frequency divided
by 16 as Ben said.
This fixes I2C master source frequency with the help of additional
properties "nest-frequency" and "bus-frequency" to root and xscom
device node separately.
Suggested-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Signed-off-by: Gavin Shan <gwshan@linux.vnet.ibm.com>
Acked-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
[stewart@linux.vnet.ibm.com: fixup hdata test for added property]
Signed-off-by: Stewart Smith <stewart@linux.vnet.ibm.com>
Diffstat (limited to 'hdata/spira.c')
-rw-r--r-- | hdata/spira.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/hdata/spira.c b/hdata/spira.c index d0b0ce8..1286856 100644 --- a/hdata/spira.c +++ b/hdata/spira.c @@ -182,6 +182,7 @@ static struct dt_node *add_xscom_node(uint64_t base, uint32_t hw_id, { struct dt_node *node; uint64_t addr, size; + uint64_t freq; addr = base | ((uint64_t)hw_id << PPC_BITLSHIFT(28)); size = (u64)1 << PPC_BITLSHIFT(28); @@ -213,6 +214,13 @@ static struct dt_node *add_xscom_node(uint64_t base, uint32_t hw_id, } dt_add_property_u64s(node, "reg", addr, size); + /* Derive bus frquency */ + freq = dt_prop_get_u64_def(dt_root, "nest-frequency", 0); + freq /= 4; + if (freq) + dt_add_property_cells(node, "bus-frequency", + hi32(freq), lo32(freq)); + return node; } @@ -693,6 +701,8 @@ static void add_iplparams_sys_params(const void *iplp, struct dt_node *node) const struct iplparams_sysparams *p; u32 sys_type; const char *sys_family; + const struct HDIF_common_hdr *hdif = iplp; + u16 version = be16_to_cpu(hdif->version); p = HDIF_get_idata(iplp, IPLPARAMS_SYSPARAMS, NULL); if (!CHECK_SPPTR(p)) { @@ -732,6 +742,15 @@ static void add_iplparams_sys_params(const void *iplp, struct dt_node *node) } dt_add_property_strings(dt_root, "compatible", "ibm,powernv", sys_family); + + /* Grab nest frequency when available */ + if (version >= 0x005b) { + u64 freq = be32_to_cpu(p->nest_freq_mhz); + + freq *= 1000000; + dt_add_property_cells(dt_root, "nest-frquency", + hi32(freq), lo32(freq)); + } } static void add_iplparams_ipl_params(const void *iplp, struct dt_node *node) |