86 Commits

Author SHA1 Message Date
ian
1cf579b9a3 MFC r282516:
Add the code necessary to run the imx6 chip at its lowest clock/power
  operating point (396MHz/950mV).
2015-05-24 19:00:46 +00:00
ian
d6c6dd582e MFC r268838, r277644:
Add support for Toradex Apalis i.MX6 development board.

  Add support for imx6 audio transmitting, include drivers for:
  o Digital Audio Multiplexer (AUDMUX)
  o Smart Direct Memory Access Controller (SDMA)
  o Synchronous Serial Interface (SSI)
2015-05-24 18:59:45 +00:00
ian
f3f411e10b MFC r279723, r279724:
Define new linker set, UART_FDT_CLASS_AND_DEVICE, for registering full
  (class and device) FDT UART. Define second one, UART_FDT_CLASS, for UART
  class only.

  Move the uart_class definitions and fdt compat data into the individual
  uart implementations, and export them using the new linker-set mechanism.
2015-05-23 20:54:25 +00:00
loos
a7a8c39e00 MFC r274670, r274671, r276168:
Moves all the duplicate code to a single function.

Verify for invalid modes and unwanted flags before pass the new flags to
driver.

Make gpio_default_map_gpios() static.  No functional changes.

Improves the GPIO API description a little bit.

gpio_pin_max must return the maximum supported pin number and not the total
number of pins on the system.
2015-02-14 21:16:19 +00:00
loos
f991641986 MFC r273799:
Make the GPIO children attach to the first unit available and not only to
unit 0.

This fix a bug where a GPIO controller could fail to attach its children
(gpioc and gpiobus) if another GPIO driver attach first.
2015-02-14 20:37:33 +00:00
ian
1b3e6163a9 MFC r277555, r277568:
Enable all sd device clocks on imx6.

  Add imx5/6 pinmux driver support for encoded input register configs.
2015-02-13 23:34:40 +00:00
ian
56013bbc63 MFC r277454, r277460, r277465, r277466, r277467, r277469, r277470, r277471,
r277472, r277473, r277474, r277475, r277476, r277477, r277478, r277479,
    r277480, r277512, r277516:

  Add inline implementations of arm bus_space_read/write_N().

  Revise the arm bus_space implementation to avoid dereferencing the tag on
  every operation to retrieve the bs_cookie value almost nothing actually uses.

  Use the explicit member initializer style to init the bus_space struct.

  Use arm/bus_space-v6.c for all armv6 systems

  Consolidate many identical implementations of bus_space to a single
  common tag and implementation shared by armv4 and armv6.

  Micro-optimize the new arm inline bus_space implementation by grouping all
  the data the inline functions access together at the start of the bus_space
  struct so that they all fit in a single cache line.
2015-02-13 22:32:02 +00:00
ian
d8b2164f70 MFC r257740, r257739: Switch to using common armv6 bus_space tag. 2015-02-13 22:01:14 +00:00
ian
ba124c2ef3 MFC r276047: Add -march=armv7a to the kernel compile for all v7a ARM systems. 2015-02-11 22:47:48 +00:00
hselasky
181bf69d80 MFC r266969 and r276717:
Add 64-bit DMA support in the XHCI controller driver.
- Fix some comments and whitespaces while at it.
- Add support for PAE.
2015-02-05 20:03:02 +00:00
ian
d082e488cb MFC r274641, r274644, r274822, r276049:
Allow i2c bus speed to be configured via hints, FDT data, and sysctl.

  Implement bus speed setting for OMAP4, AM335x, and imx5/6.

  Fix the i2c bus speed divisors for TI OMAP4 and AM335x to give the
  advertised 100, 400, and 1000 KHz speeds.

PR:		195009
2014-12-27 02:37:52 +00:00
ian
dda8b6a9a4 MFC r274412, r274413, r274414: Bugfixes for imx5/6 pinctrl driver. 2014-12-27 01:35:03 +00:00
ian
4666b07fe9 MFC r273561:
Install a temporary workaround to avoid problems in fdt data with linux's
  workaround for an imx6 chip erratum by using gpio1_6 as an interrupt.
2014-10-26 16:02:35 +00:00
ian
34e0375805 MFC r273353, r273514:
Attach the imx6 CCM driver during BUS_PASS_CPU.

  Unconditionally enable the clocks for all imx6 devices that we have drivers
  for, or that are required to run the chip (such as busses).
2014-10-26 04:17:20 +00:00
ian
aec69e1f98 MFC r273352: Ask for the fastest available clock for the GTP timecounter. 2014-10-26 04:15:27 +00:00
ian
449c80cb11 MFC r273283:
Attach this driver during BUS_PASS_BUS and move the cpu init code to a
  bus_new_pass() handler so it doesn't happen until BUS_PASS_CPU.  This allows
  the anatop driver to outbid the generic simplebus driver (which the FDT
  data describes as compatible).
2014-10-26 04:11:32 +00:00
ian
839e78bb76 MFC r271595, r271601, r271607, r271630:
Add compat strings for all the flavors of GIC this driver should support.
  Also allow the driver to attach to ofwbus as well as simplebus, some FDT
  data puts the root interrupt controller on the root bus.

  Add a common routine for parsing FDT data describing an ARM GIC interrupt.

  Use gic_decode_fdt() rather than a local routine to parse fdt interrupt
  properties.  Move fdt_pic_table and fdt_fixup_table into imx6_machdep.c,
  which means imx6 doesn't need imx_common.c anymore.

  The private peripheral interrupts start at offset 16, not 0.  Also, use
  names rather than inline mystery constants for these offsets.
2014-10-26 03:52:45 +00:00
ian
552dafa953 MFC r271550, r271591:
Replace the imx5 and imx6 iomux drivers with a single common driver that
  uses the new fdt_pinctrl interface.
2014-10-26 03:44:19 +00:00
ian
6bda1023a0 MFC r271097, r271100, r271101, r271102, r271124:
- Add a basic iomux driver for imx6.
 - Implement the same public interface in imx51 and imx6 iomux
 - The iomux driver is no longer optional, remove it from kernel configs.
 - Implement the imx_iomux_get/set_gpr() interface for imx6.
 - Stop setting the iomux device status to disabled, now that we have a driver.
2014-10-26 02:44:41 +00:00
ian
caa088c379 MFC r268973, r268977: Rename i.MX I2C driver file, enable it on imx6. 2014-10-26 02:40:34 +00:00
ian
bb76782ad5 MFC r268834, r268835:
o Enable GPIO device driver for i.MX6.
   It was originally written for i.MX5 and compatible with newer chip.
 o Extend device tree information
 o style(9) fixes
 o Rename gpio driver file.
2014-10-26 02:37:42 +00:00
ian
c691dc79ec MFC r271055, r271084, r271094:
Add a function to get the frequency of the AHB bus.  Another stopgap
  function until we have full clock support for imx6.

  The imx5x and imx6 chips have an onboard IOMUX device which also contains a
  few "general purpose registers" whose values control chip behavior in ways
  that have nothing to do with IO pin mux control.  Define a simple API that
  other soc-specific code can use to read and write the registers, and provide
  the imx51 implementation of them.

  Fix a typo.
2014-10-26 02:25:34 +00:00
ian
04b1fcec06 MFC r270955,r270956: make the imx6 octop and anatop drivers early attachers. 2014-10-26 02:09:58 +00:00
ian
1c8cde378e MFC r270945:
Rename OF_xref_phandle() to OF_node_from_xref() and add a new function
that provides the inverse translation, OF_xref_from_node().
2014-10-26 01:30:46 +00:00
ian
a029ba8e5f MFC r270065:
Move the imx6 sysctl temperature info to hw.imx6 where all the other
  soc-wide info lives.  It was under dev.imx6_anatop.0.

Approved by:	re(gjb)
2014-09-09 19:47:35 +00:00
marius
e31bbc3dc1 MFC: r270885, r270948
- Nuke unused sdhci_softc.
- Static'ize sdhci_debug local to sdhci.c.
- Const'ify PCI device description strings.
- Nuke redundant resource ID members from sdhci_pci_softc.
- Nuke unused hw.sdhci_pci.debug tunable.
- Add support for using MSI instead of INTx, controllable via the tunable
  hw.sdhci.enable_msi (defaulting to on) and tested with a RICOH R5CE823 SD
  controller.
- Use NULL instead of 0 for pointers.
2014-09-03 20:07:26 +00:00
dumbbell
9ac8060e57 vt(4): Colors are indexed against a console palette, not a VGA palette
Rename vt_generate_vga_palette() to vt_generate_cons_palette() and
change it to build a palette where the color index is the same than in
terminal escape codes, not the VGA index. That's what TCHAR_CREATE()
uses and passes to vt(4).

The main differences between both orders are:
    o  Blue and red are swapped (1 <-> 4)
    o  Yellow and cyan are swapped (3 <-> 6)

The problem remained unnoticed, because the RGB bit indexes passed to
vt_generate_vga_palette() were reversed. This inversion was cancelled
by the colors inversions in the generated palette. For instance, red
(0xff0000) and blue (0x0000ff) have bytes in opposite order, but were
swapped in the palette. But after changing the value of blue (see last
paragraph), the modified color was in fact the red one.

While here, tune the palette to better match console colors and improve
the readability (especially the dark blue).

This is an MFC of r269783 and r269791.
2014-08-21 10:18:42 +00:00
ian
704fa959ad MFC r269607, r269698:
Cache the imx6 SoC type in a static var so that it only has to be figured
  out by sniffing hardware registers once.

  Add a missing clock register definition.
2014-08-17 01:32:33 +00:00
ian
3a58a39d52 MFC r268401, r268495:
Pending interrupt status is cleared by writing to the ISR, not the data reg.

  Use named constant rather than '0' to access the reset controller register.
2014-07-25 23:36:39 +00:00
ian
3991eff3e4 MFC 265440, 265441, 265444, 265445, 265446, 265447:
Move the pl310.enabled tunable to hw.pl310.enabled.  Clean up a few minor
  style(9) nits.  Use DEVMETHOD_END.

  Break out the code that figures out the L2 cache geometry to its own
  routine, so that it can be called from multiple places in upcoming changes.

  Call platform_pl310_init() before enabling the controller, and handle the
  case where the controller is already enabled.

  Add defines for the bits in the PL310 debug control register.

  Add a public routine to set the L2 cache ram latencies.  This can be
  called by platform init routines to fine-tune cache performance.

  Enable PL310 power-saving modes and tune the cache ram latencies for imx6.
2014-05-18 00:26:42 +00:00
ian
306b3492c9 MFC 265035: Move duplicated code to print l2 config into the common code. 2014-05-17 23:07:26 +00:00
ian
b256d04478 MFC 264977:
Stop calling imx51_ccm_foo() clock functions from imx6 code.  Instead
  define a few imx_ccm_foo() functions that are implemented by the imx51
  or imx6 ccm code.
2014-05-17 22:29:24 +00:00
ian
38a9e433e4 MFC 264251: Updates to i.MX53:
* Define support for the SDHCI driver, although it doesn't work yet
  * Fix the memory mappings for IPU
2014-05-17 22:00:10 +00:00
ian
9aa7e8141a MFC 264180, 264181, 264182:
Follow files.imx51 and add vt support for imx53.

  Add fsl,imx53 compatible string.

  Need to include machine/fdt.h in vt_early_fb.c
2014-05-17 21:31:58 +00:00
ian
941a79bd10 MFC 264052, 264057, 264065, 264094, 264103, 264120
Actually save the mpcore clock frequency retrieved from fdt data.

  imx6..
  - Don't call sdhci_init_slot() until after handling the FDT properties
    related to detecting card presence.
  - Flag several sysctl variables as tunables.
  - Rework the cpu frequency management code for imx6 to add "operating
    points" and min/max frequency controls.

  generic timer...
  - Setup both secure and non-secure timer IRQs.
    We don't know our ARM security state, so one of them will operate.
  - Don't set frequency, since it's unpossible in non-secure state.
    Only rely on DTS clock-frequency value or get clock from timer.
2014-05-17 20:52:10 +00:00
ian
e111203de4 MFC 264054, 264056
Switch imx6 to using the mpcore per-cpu event timers, but continue to use
  the GPT timer, which is fixed-frequency, as a timecounter.

  Change NO_EVENTTIMERS from an arm-specific to an MI option, so that it can
  be used in MI code.
2014-05-17 20:22:22 +00:00
ian
f51629e24e MFC 262952, 262958, 262966, 262979, 262980, 262986, 262987, 262995, 262997,
263030, 263033, 263034, 263056, 263057,

  Remove all the redundant external declarations of exception vectors and
  runtime setting of the pointers that's scattered around various places.

  Remove all traces of support for ARM chips prior to the arm9 series.

  Make the default exception handler vectors point to where I thought they
  were already pointing: the default handlers (not a panic that says there
  is no default handler).

  Eliminate irq_dispatch.S.  Move the data items it contained into
  arm/intr.c and the functionality it provided into arm/exception.S.

  Move the exception vector table (so-called "page0" data) into exception.S
  and eliminate vectors.S.

  Change the way the asm GET_CURTHREAD_PTR() macro is defined so that code
  using it doesn't have to have an "AST_LOCALS" macro somewhere in the file.

  Arrange for arm fork_trampoline() to return to userland via the standard
  swi_exit code in exception.S instead of having its own inline expansion
  of the DO_AST and PULLFRAME macros.

  Now that the PUSHFRAME and PULLFRAME macros are used only in the swi
  entry/exit code, they don't need to be macros.  Except that didn't work
  and the whole change was reverted.

  Remove some unnecessary indirection and jump right to the handler functions.

  Use panic rather than printf to "handle" an arm26 address exception
  (should never happen on arm32).

  Remove the unreferenced DATA() macro.

  Remove #include <machine/asmacros.h> from files that don't need it.
2014-05-17 13:53:38 +00:00
ian
a8f1dca86b MFC 257774, 256760, 262916, 262905, 262918, 262919, 262920, 262921, 262924,
262925, 262929, 262932, 262935, 262940, 262941, 262942, 262948, 262949,
    262950

  Strip arm/conf/DEFAULTS down to just items that are mandatory for running
  the architecture.

  Move all the files named foo/common.c to foo/foo_common.c

  Initial cut for DTS on the hl201 board.

  Add commented out dts for sam9260ek as well as early printf support.

  Make clock optional on uart nodes, then back it out ("I don't know what I
  was thinking, but it is lame.")

  Set the baud rate if it isn't 0

  Make at91_soc_id() public.

  Properly round at91 resource on unmapping.

  Move AT91 AIC related stuff to own file.

  Fix another bug in multicast filtering.  i.MX uses 6 bits from MSB in
  LE CRC32 for the hash value, not the lowest 6 bits in BE CRC32.

  Follow r262916 with one more config file that references a renamed common.c

  Remove bogus AT91 define that causes compile errors.  Most of the defines
  for SAM9X are going away soonish anyway (once FDT works), but until
  then...

  Remove all dregs of a per-thread undefined-exception-mode stack.

  Rework the VFP code that handles demand-based save and restore of state.

  Always call vfp_discard() on thread death.

  When a thread begins life it doesn't own the VFP hardware state on any cpu.

  Make undefined exception entry MP-safe.
2014-05-17 00:53:12 +00:00
ian
8c5245706f MFC 262695, 262708, 262709, 262710, 262711, 262728, 262870, 262877, 262880,
262885, 262891, 262903,

  imx6: Add a tunable to set the number of active cores, enable SMP by default.

  ffec: Fix multicast filtering.

  Allwinner a10/a20...
  - Add gpio and clock bits for A10/A20's EMAC ethernet controller driver
    - EMAC gpio configuration
    - EMAC clock activation
  - Add Static Random Access Memory controller driver for A10/A20.
      A10/A20's SRAM is used by devices, such as CPU, EMAC,
      for extra fast memory or as cache.
  - Add EMAC 10/100 Ethernet controller driver for A10/A20.
      It is available mostly in A10 devices like Hackberry, Marsboard,
      Mele A1000, A2000, A100 HTPC, cubieboard1 and A20 device
      like cubieboard2.
      TX performance can be improved using both channels 0 and 1.
      RX performance is poor and needs improvement with the assistance of
      external DMA controller in case there
  - Add EMAC and SRAM controller entries to FDT.
  - Add EMAC device to kernel config files and enable EMAC, SRAM drivers.

  OMAP: When calculating the MPU freq, make sure not to overflow.

  Vybrid:
  - Add driver for Port control and interrupts (PORT).
  - Export panel info to DTS
  - Reset all the layers before setup first one
  - Enable display

  nandfs: Slight code reordering to make error branch last.

  Add option TMPFS to arm/conf/DEFAULTS, remove it from the few configs
  that have it individually.  Concensus on freebsd-arm@ is that it should
  be included in all ARM kernels.

  Fix the arm sys_sigreturn(): its argument is a struct ucontext, not a
  struct sigframe containing the struct ucontext.
2014-05-16 23:27:18 +00:00
ian
979d093228 MFC r262534, r262548, r262549, r262552, r262568, r262581, r262583, r262584,
r262585, r262587, r262696, r262712

  Replace many pasted identical definitions of cpu_initclocks() with a common
  implementation in arm/machdep.c.

  aicasm: Don't complain about missing prototypes to ease bootstrap issues.

  Vybrid: Add driver for Inter-Integrated Circuit (I2C).

  imx6: Initialize the Low Power Mode bits to keep the ARM cores running
  during WFI.

  All our current ARM multi-core systems have all cores in one package with
  a shared L2 cache, reflect that in the common cpu_topo() routine.

  mpcore timer: Supply a DELAY() implementation via weak linkage, so that
  SoC-specific code can supply a better implementation.

  imx6: Add some rudimentary voltage control.

  Add an armv7 implementation of cpu_sleep().

  Add __used attribute so that the DELAY implementation doesn't get
  optimized away as unreferenced, causing linker errors when trying to
  resolve the weak reference to the missing function.
2014-05-16 02:21:51 +00:00
ian
e58449eb7b MFC r262409, r262411, r262413, r262420, r262426, r262427, r262440, r262456,
r262482, r262483, r262531,

  Move the declaration for mpentry() into a header file instead of pasting
  it into a bunch of different .c files.

  If the L2 cache type is PIPT, pass a physical address for a flush.

  Actually set the proper bit to indicate TTB shared memory.

  Add a new cache maintenance function, idcache_inv_all, to the table, and
  implementations for each of the chips we support.

  Invalidate caches immediately upon entry to init_secondary().  Also set
  the Bufferable bit in the PDE entries of the secondary processor startup
  pagetables.

  Add the bits needed to run SMP on imx6.

  Invalidate the SCU cache tag ram on all 4 cores, not just 1-3.

  Minor tweaks to the imx GPT timer

  Vybrid enhancements...
  - Pin configuration is a complete iomux register now and includes
    drive strength, pull mode, mux mode, speed, etc.
  - Add i2c devices to the tree
  - Add IPG clock
  - Add support for Quartz Module.
  - Pin configuration is a complete iomux register now and includes
    drive strength, pull mode, mux mode, speed, etc.
  - Add i2c devices to the tree
  - Add IPG clock
2014-05-16 00:14:50 +00:00
ian
56c3d6e841 MFC r261982, r261987, r262123, r262244, r262278, r262280, r262353, r262354,
r262355, r262419,

  Add Vybrid driver for Synchronous Audio Interface (SAI).

  Decrease SAI buffer size. Handle eDMA interrupt on running channel only.

  Give the physmem fdt helper routines static linkage since no global
  definition of them is provided anywhere.

  Add imx6 early printf support, wrapped in #if 0 because it's rarely needed.

  Add basic cpu frequency control and temperature monitoring to imx6_anatop.

  Add the FREEBSD_BOOT_LOADER option so that a loaded DTB passed in from
  ubldr will actually get used.

  Create a generic IMX6 kernel config, then fix it to have an ident line.

  Don't force imx6 bootverbose on anymore, it can be set from ubldr now.
2014-05-15 22:50:06 +00:00
ian
dbea31deb0 MFC r261938, r261939, r261940, r261944, r261945, r261946, r261947, r261956, r261957, r261983, r261094,
r261955, r261958,

  Add a driver to provide access to imx6 on-chip one-time-programmble data.

  Make it possible to access the ocotp registers before the ocotp device
  is attached, by establishing a temporary mapping of the registers when
  necessary.

  It turns out Freescale cleverly made the ocotp device compatible across
  several different families of SoCs, so move it to the freescale directory
  and prefix everything with fsl rather than imx6.

  Convert the imx6 sdhci "R1B fix" from a busy-loop in the interrupt handler
  to a callout.

  Increase the wait time for acquiring the SD bus from 10 to 250ms.

  If no compatible cards were found after probing the SD bus, say so.

  Add timeout logic to sdhci, separate from the timeouts done by the hardware.

  After a timeout, reset the controller using SDHCI_RESET_CMD|SDHCI_RESET_DATA
  rather than SDHCI_RESET_ALL; the latter turns off clocks and power, removing
  any possibility of recovering from the error.

  Add a helper routine to depth-search the device tree for a node with a
  matching 'compatible' property.
2014-05-15 22:35:04 +00:00
ian
2adbcd85c2 MFC r261803, r261808, r261814, r261815, r261816, r261817, r261818, r261826,
r261848, r261855

  On armv6 and later, use the WriteNotRead bit of the fault status register
  to decide what protections are required by the faulting access.

  Use the right symbols for determining arm architecture.  Include the
  necessary header file which has the new FAULT_WNR symbol defined in it.

  Allow the kernel to be loaded at any 1MiB address. This requirement is
  because we use the 1MiB section maps as they only need a single pagetable.

  Add function for configuring Vybrid PLL4 (Audio) clock frequency output.

  imx6 changes ...

  - Fix the definition of the SDHCI_STATE_DAT and SDHCI_STATE_CMD fields,
    and add SDHCI_RETUNE_REQUEST.  None of these are actually used in the
    code yet.

  - Write translation code for the SDHCI_PRESENT_STATE register.
    Freescale moved some bits around in their version of the register,
    adjust things so that the sdhci code sees the standard layout.

  - Add standard non-removable and cd-gpios properties to the usdhc
    devices.  That generates references to gpio devices, so uncomment them
    even though there isn't a gpio driver to do anything with them yet.

  - Add handling of standard "non-removable" property, and also some
    workaround code so that if card detect is wired to a gpio pin, for now
    we just treat it the same as non-removable (because there isn't a gpio
    driver yet).

  - Enable both sdcard slots, but not the sdio-based wifi that we don't
    yet have a driver for.

  - Remove a couple obsolete function declarations.
2014-05-15 22:03:24 +00:00
ian
c287c5d530 MFC r261616, r261639
Remove FreeBSD 6 support from atmel usb controllers.

  Add Vybrid drivers for:
  - Enhanced Direct Memory Access Controller (eDMA)
  - Direct Memory Access Multiplexer (DMAMUX)
2014-05-15 18:38:19 +00:00
loos
aa8cf03563 MFC r259270
After r266105 ofw_iicbuc.c will be built by default for any kernel which
includes options 'iicbus' and 'fdt'.  Remove the (now) unnecessary entries.
2014-05-15 18:18:53 +00:00
ian
1e3130abad MFC r261423, r261424, r261516, r261513, r261562, r261563, r261564, r261565,
r261596, r261606

  Add the imx sdhci controller.

  Move Open Firmware device root on PowerPC, ARM, and MIPS systems to
  a sub-node of nexus (ofwbus) rather than direct attach under nexus. This
  fixes FDT on x86 and will make coexistence with ACPI on ARM systems easier.
  SPARC is unchanged.

  Add the missing ')' at end of sentence.  Reword it to use a more common idiom.

  Pass the kernel physical address to initarm through the boot param struct.

  Make functions only used in vfp.c static, and remove vfp_enable.

  Fix __syscall on armeb EABI. As it returns a 64-bit value it needs to
  place 32-bit data in r1, not r0. 64-bit data is already packed correctly.

  Use abp_physaddr for the physical address over KERNPHYSADDR. This helps us
  remove the need to load the kernel at a fixed address.

  Remove references to PHYSADDR where it's used only in debugging output.

  Dynamically generate the page table. This will allow us to detect the
  physical address we are loaded at to change the mapping.
2014-05-15 17:30:16 +00:00
ian
36cb581eae MFC r261411, r261413, r261416:
Add support for Colibri VF50 Evaluation Board.

  Add driver for Display Control Unit (DCU4).

  Add prototype for tcon_bypass() used by dcu4.
  Add register definition.
2014-05-15 16:23:24 +00:00
ian
20a269e6c7 MFC r261410
Follow r261352 by updating all drivers which are children of simplebus
  to check the status property in their probe routines.
2014-05-15 16:11:06 +00:00
ian
69ca53fdd2 MFC r261406, r261409: enhance Vybrid support...
o Expand device tree information
  o Export iomuxc (pins) configuration to DTS
  o Allow devices to assign clocks in DTS
  o Split kernel configuration to chip common and board specific parts.
2014-05-15 15:43:33 +00:00