/* Copyright (c) 2017, The Linux Foundation. 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 and
 * only version 2 as published by the Free Software Foundation.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#ifndef _IPA_PM_H_
#define _IPA_PM_H_

#include <linux/msm_ipa.h>

/* internal to ipa */
#define IPA_PM_MAX_CLIENTS 10
#define IPA_PM_MAX_EX_CL 64
#define IPA_PM_THRESHOLD_MAX 5
#define IPA_PM_EXCEPTION_MAX 2
#define IPA_PM_DEFERRED_TIMEOUT 100
#define IPA_PM_STATE_MAX 7

/*
 * ipa_pm group names
 *
 * Default stands for individual clients while other groups share one throughput
 * Some groups also have special flags like modem which do not vote for clock
 * but is accounted for in clock scaling while activated
 */
enum ipa_pm_group {
	IPA_PM_GROUP_DEFAULT,
	IPA_PM_GROUP_APPS,
	IPA_PM_GROUP_MODEM,
	IPA_PM_GROUP_MAX,
};

/*
 * ipa_pm_cb_event
 *
 * specifies what kind of callback is being called.
 * IPA_PM_CLIENT_ACTIVATED: the client has completed asynchronous activation
 * IPA_PM_REQUEST_WAKEUP: wake up the client after it has been suspended
 */
enum ipa_pm_cb_event {
	IPA_PM_CLIENT_ACTIVATED,
	IPA_PM_REQUEST_WAKEUP,
	IPA_PM_CB_EVENT_MAX,
};

/*
 * struct ipa_pm_exception - clients included in exception and its threshold
 * @usecase: comma separated client names
 * @threshold: the threshold values for the exception
 */
struct ipa_pm_exception {
	const char *usecase;
	int threshold[IPA_PM_THRESHOLD_MAX];
};

/*
 * struct ipa_pm_init_params - parameters needed for initializng the pm
 * @default_threshold: the thresholds used if no exception passes
 * @threshold_size: size of the threshold
 * @exceptions: list of exceptions  for the pm
 * @exception_size: size of the exception_list
 */
struct ipa_pm_init_params {
	int default_threshold[IPA_PM_THRESHOLD_MAX];
	int threshold_size;
	struct ipa_pm_exception exceptions[IPA_PM_EXCEPTION_MAX];
	int exception_size;
};

/*
 * struct ipa_pm_register_params - parameters needed to register a client
 * @name: name of the client
 * @callback: pointer to the client's callback function
 * @user_data: pointer to the client's callback parameters
 * @group: group number of the client
 * @skip_clk_vote: 0 if client votes for clock when activated, 1 if no vote
 */
struct ipa_pm_register_params {
	const char *name;
	void (*callback)(void*, enum ipa_pm_cb_event);
	void *user_data;
	enum ipa_pm_group group;
	bool skip_clk_vote;
};

int ipa_pm_register(struct ipa_pm_register_params *params, u32 *hdl);
int ipa_pm_associate_ipa_cons_to_client(u32 hdl, enum ipa_client_type consumer);
int ipa_pm_activate(u32 hdl);
int ipa_pm_activate_sync(u32 hdl);
int ipa_pm_deferred_deactivate(u32 hdl);
int ipa_pm_deactivate_sync(u32 hdl);
int ipa_pm_set_perf_profile(u32 hdl, int throughput);
int ipa_pm_deregister(u32 hdl);

/* IPA Internal Functions */
int ipa_pm_init(struct ipa_pm_init_params *params);
int ipa_pm_destroy(void);
int ipa_pm_handle_suspend(u32 pipe_bitmask);
int ipa_pm_deactivate_all_deferred(void);
int ipa_pm_stat(char *buf, int size);
int ipa_pm_exceptions_stat(char *buf, int size);

#endif /* _IPA_PM_H_ */
