/*
 * Copyright (c) 2020 Raspberry Pi (Trading) Ltd.
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef _HARDWARE_XOSC_H
#define _HARDWARE_XOSC_H

#include "pico.h"
#include "hardware/structs/xosc.h"


// Allow lengthening startup delay to accommodate slow-starting oscillators

// PICO_CONFIG: PICO_XOSC_STARTUP_DELAY_MULTIPLIER, Multiplier (from 1ms) for xosc startup delay to accommodate slow-starting oscillators, type=int, min=1, default=6, group=hardware_xosc
#ifndef PICO_XOSC_STARTUP_DELAY_MULTIPLIER
#define PICO_XOSC_STARTUP_DELAY_MULTIPLIER 6
#endif


#ifdef __cplusplus
extern "C" {
#endif

/** \file hardware/xosc.h
 *  \defgroup hardware_xosc hardware_xosc
 *
 * \brief Crystal Oscillator (XOSC) API
 */

/*! \brief  Initialise the crystal oscillator system
 *  \ingroup hardware_xosc
 *
 * This function will block until the crystal oscillator has stabilised.
 **/
void xosc_init(void);

/*! \brief  Disable the Crystal oscillator
 *  \ingroup hardware_xosc
 *
 * Turns off the crystal oscillator source, and waits for it to become unstable
 **/
void xosc_disable(void);

/*! \brief Set the crystal oscillator system to dormant
 *  \ingroup hardware_xosc
 *
 * Turns off the crystal oscillator until it is woken by an interrupt. This will block and hence
 * the entire system will stop, until an interrupt wakes it up. This function will
 * continue to block until the oscillator becomes stable after its wakeup.
 **/
void xosc_dormant(void);

#ifdef __cplusplus
}
#endif

#endif
