/*
 * Copyright 2012-2016 Freescale Semiconductor, Inc. All Rights Reserved.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation.
 */

#ifndef __ASM_ARCH_MXC_BUSFREQ_H__
#define __ASM_ARCH_MXC_BUSFREQ_H__

#include <linux/notifier.h>
#include <linux/regulator/consumer.h>

/*
 * This enumerates busfreq low power mode entry and exit.
 */
enum busfreq_event {
	LOW_BUSFREQ_ENTER,
	LOW_BUSFREQ_EXIT,
};

/*
  * This enumerates the system bus and ddr frequencies in various modes.
  * BUS_FREQ_HIGH - DDR @ 528MHz, AHB @ 132MHz.
  * BUS_FREQ_MED - DDR @ 400MHz, AHB @ 132MHz
  * BUS_FREQ_AUDIO - DDR @ 50MHz/100MHz, AHB @ 24MHz.
  * BUS_FREQ_LOW  - DDR @ 24MHz, AHB @ 24MHz.
  * BUS_FREQ_ULTRA_LOW - DDR @ 1MHz, AHB - 3MHz.
  *
  * Drivers need to request/release the bus/ddr frequencies based on
  * their performance requirements. Drivers cannot request/release
  * BUS_FREQ_ULTRA_LOW mode as this mode is automatically entered from
  * either BUS_FREQ_AUDIO or BUS_FREQ_LOW
  * modes.
  */
enum bus_freq_mode {
	BUS_FREQ_HIGH,
	BUS_FREQ_MED,
	BUS_FREQ_AUDIO,
	BUS_FREQ_LOW,
	BUS_FREQ_ULTRA_LOW,
};

#if defined(CONFIG_CPU_FREQ) && !defined(CONFIG_ARM64)
extern struct regulator *arm_reg;
extern struct regulator *soc_reg;
void request_bus_freq(enum bus_freq_mode mode);
void release_bus_freq(enum bus_freq_mode mode);
int register_busfreq_notifier(struct notifier_block *nb);
int unregister_busfreq_notifier(struct notifier_block *nb);
int get_bus_freq_mode(void);
#elif defined(CONFIG_ARCH_FSL_IMX8MQ)
void request_bus_freq(enum bus_freq_mode mode);
void release_bus_freq(enum bus_freq_mode mode);
int get_bus_freq_mode(void);
#else
static inline void request_bus_freq(enum bus_freq_mode mode)
{
}
static inline void release_bus_freq(enum bus_freq_mode mode)
{
}
static inline int register_busfreq_notifier(struct notifier_block *nb)
{
	return 0;
}
static inline int unregister_busfreq_notifier(struct notifier_block *nb)
{
	return 0;
}
static inline int get_bus_freq_mode(void)
{
	return BUS_FREQ_HIGH;
}
#endif
#endif
