blob: e9d3531e262e31a4f5643ee1fa28204f15cec46b [file] [log] [blame]
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +05301/*
2 * Copyright (c) 2015-2017, The Linux Foundation. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License version 2 and
6 * only version 2 as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 */
13#ifndef __WCD9XXX_COMMON_V2_H__
14#define __WCD9XXX_COMMON_V2_H__
15
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053016#include <linux/mfd/wcd9xxx/wcd9xxx_registers.h>
Laxminath Kasam605b42f2017-08-01 22:02:15 +053017#include "core.h"
Asish Bhattacharya8e2277f2017-07-20 18:31:55 +053018
19enum wcd_clock_type {
20 WCD_CLK_OFF,
21 WCD_CLK_RCO,
22 WCD_CLK_MCLK,
23};
24
25enum {
26 SIDO_SOURCE_INTERNAL,
27 SIDO_SOURCE_RCO_BG,
28};
29
30struct wcd_resmgr_cb {
31 int (*cdc_rco_ctrl)(struct snd_soc_codec *, bool);
32};
33
34struct wcd9xxx_resmgr_v2 {
35 struct snd_soc_codec *codec;
36 struct wcd9xxx_core_resource *core_res;
37
38 int master_bias_users;
39 int clk_mclk_users;
40 int clk_rco_users;
41
42 struct mutex codec_bg_clk_lock;
43 struct mutex master_bias_lock;
44
45 enum codec_variant codec_type;
46 enum wcd_clock_type clk_type;
47
48 const struct wcd_resmgr_cb *resmgr_cb;
49 int sido_input_src;
50};
51
52#define WCD9XXX_V2_BG_CLK_LOCK(resmgr) \
53{ \
54 struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \
55 pr_debug("%s: Acquiring BG_CLK\n", __func__); \
56 mutex_lock(&__resmgr->codec_bg_clk_lock); \
57 pr_debug("%s: Acquiring BG_CLK done\n", __func__); \
58}
59
60#define WCD9XXX_V2_BG_CLK_UNLOCK(resmgr) \
61{ \
62 struct wcd9xxx_resmgr_v2 *__resmgr = resmgr; \
63 pr_debug("%s: Releasing BG_CLK\n", __func__); \
64 mutex_unlock(&__resmgr->codec_bg_clk_lock); \
65}
66
67#define WCD9XXX_V2_BG_CLK_ASSERT_LOCKED(resmgr) \
68{ \
69 WARN_ONCE(!mutex_is_locked(&resmgr->codec_bg_clk_lock), \
70 "%s: BG_CLK lock should have acquired\n", __func__); \
71}
72
73int wcd_resmgr_enable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr);
74int wcd_resmgr_disable_master_bias(struct wcd9xxx_resmgr_v2 *resmgr);
75struct wcd9xxx_resmgr_v2 *wcd_resmgr_init(
76 struct wcd9xxx_core_resource *core_res,
77 struct snd_soc_codec *codec);
78void wcd_resmgr_remove(struct wcd9xxx_resmgr_v2 *resmgr);
79int wcd_resmgr_post_init(struct wcd9xxx_resmgr_v2 *resmgr,
80 const struct wcd_resmgr_cb *resmgr_cb,
81 struct snd_soc_codec *codec);
82int wcd_resmgr_enable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr,
83 enum wcd_clock_type type);
84int wcd_resmgr_disable_clk_block(struct wcd9xxx_resmgr_v2 *resmgr,
85 enum wcd_clock_type type);
86int wcd_resmgr_get_clk_type(struct wcd9xxx_resmgr_v2 *resmgr);
87void wcd_resmgr_post_ssr_v2(struct wcd9xxx_resmgr_v2 *resmgr);
88void wcd_resmgr_set_sido_input_src_locked(struct wcd9xxx_resmgr_v2 *resmgr,
89 int sido_src);
90void wcd_resmgr_set_sido_input_src(struct wcd9xxx_resmgr_v2 *resmgr,
91 int sido_src);
92
93#endif