blob: 714894527e06a50c9dc3903928b610b8a7035423 [file] [log] [blame]
Wang Xingchao99a20082013-05-30 22:07:10 +08001/*
2 * hda_i915.c - routines for Haswell HDA controller power well support
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the Free
6 * Software Foundation; either version 2 of the License, or (at your option)
7 * any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
11 * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software Foundation,
16 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
17 */
18
19#include <linux/init.h>
20#include <linux/module.h>
Imre Deakd7055bd2015-01-08 17:54:17 +020021#include <linux/pci.h>
22#include <linux/component.h>
23#include <drm/i915_component.h>
Wang Xingchao99a20082013-05-30 22:07:10 +080024#include <sound/core.h>
Mengdong Line4d9e512014-07-03 17:02:23 +080025#include "hda_priv.h"
Imre Deak347de1f2015-01-08 17:54:15 +020026#include "hda_intel.h"
Wang Xingchao99a20082013-05-30 22:07:10 +080027
Mengdong Line4d9e512014-07-03 17:02:23 +080028/* Intel HSW/BDW display HDA controller Extended Mode registers.
29 * EM4 (M value) and EM5 (N Value) are used to convert CDClk (Core Display
30 * Clock) to 24MHz BCLK: BCLK = CDCLK * M / N
31 * The values will be lost when the display power well is disabled.
32 */
Takashi Iwai1a0e3f92014-07-04 07:48:57 +020033#define AZX_REG_EM4 0x100c
34#define AZX_REG_EM5 0x1010
Mengdong Line4d9e512014-07-03 17:02:23 +080035
Imre Deak926981a2015-01-08 17:54:16 +020036int hda_display_power(struct hda_intel *hda, bool enable)
Wang Xingchao99a20082013-05-30 22:07:10 +080037{
Imre Deakd7055bd2015-01-08 17:54:17 +020038 struct i915_audio_component *acomp = &hda->audio_component;
39
40 if (!acomp->ops)
Takashi Iwai74b0c2d2014-06-13 15:14:34 +020041 return -ENODEV;
Wang Xingchao99a20082013-05-30 22:07:10 +080042
Imre Deakd7055bd2015-01-08 17:54:17 +020043 dev_dbg(&hda->chip.pci->dev, "display power %s\n",
44 enable ? "enable" : "disable");
Wang Xingchao99a20082013-05-30 22:07:10 +080045 if (enable)
Imre Deakd7055bd2015-01-08 17:54:17 +020046 acomp->ops->get_power(acomp->dev);
Wang Xingchao99a20082013-05-30 22:07:10 +080047 else
Imre Deakd7055bd2015-01-08 17:54:17 +020048 acomp->ops->put_power(acomp->dev);
49
50 return 0;
Wang Xingchao99a20082013-05-30 22:07:10 +080051}
52
Imre Deak926981a2015-01-08 17:54:16 +020053void haswell_set_bclk(struct hda_intel *hda)
Mengdong Line4d9e512014-07-03 17:02:23 +080054{
55 int cdclk_freq;
56 unsigned int bclk_m, bclk_n;
Imre Deakd7055bd2015-01-08 17:54:17 +020057 struct i915_audio_component *acomp = &hda->audio_component;
Mengdong Line4d9e512014-07-03 17:02:23 +080058
Imre Deakd7055bd2015-01-08 17:54:17 +020059 if (!acomp->ops)
Mengdong Line4d9e512014-07-03 17:02:23 +080060 return;
61
Imre Deakd7055bd2015-01-08 17:54:17 +020062 cdclk_freq = acomp->ops->get_cdclk_freq(acomp->dev);
Mengdong Line4d9e512014-07-03 17:02:23 +080063 switch (cdclk_freq) {
64 case 337500:
65 bclk_m = 16;
66 bclk_n = 225;
67 break;
68
69 case 450000:
70 default: /* default CDCLK 450MHz */
71 bclk_m = 4;
72 bclk_n = 75;
73 break;
74
75 case 540000:
76 bclk_m = 4;
77 bclk_n = 90;
78 break;
79
80 case 675000:
81 bclk_m = 8;
82 bclk_n = 225;
83 break;
84 }
85
Imre Deak926981a2015-01-08 17:54:16 +020086 azx_writew(&hda->chip, EM4, bclk_m);
87 azx_writew(&hda->chip, EM5, bclk_n);
Mengdong Line4d9e512014-07-03 17:02:23 +080088}
89
Imre Deakd7055bd2015-01-08 17:54:17 +020090static int hda_component_master_bind(struct device *dev)
91{
92 struct snd_card *card = dev_get_drvdata(dev);
93 struct azx *chip = card->private_data;
94 struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
95 struct i915_audio_component *acomp = &hda->audio_component;
96 int ret;
97
98 ret = component_bind_all(dev, acomp);
99 if (ret < 0)
100 return ret;
101
102 if (WARN_ON(!(acomp->dev && acomp->ops && acomp->ops->get_power &&
103 acomp->ops->put_power && acomp->ops->get_cdclk_freq))) {
104 ret = -EINVAL;
105 goto out_unbind;
106 }
107
108 /*
109 * Atm, we don't support dynamic unbinding initiated by the child
110 * component, so pin its containing module until we unbind.
111 */
112 if (!try_module_get(acomp->ops->owner)) {
113 ret = -ENODEV;
114 goto out_unbind;
115 }
116
117 return 0;
118
119out_unbind:
120 component_unbind_all(dev, acomp);
121
122 return ret;
123}
124
125static void hda_component_master_unbind(struct device *dev)
126{
127 struct snd_card *card = dev_get_drvdata(dev);
128 struct azx *chip = card->private_data;
129 struct hda_intel *hda = container_of(chip, struct hda_intel, chip);
130 struct i915_audio_component *acomp = &hda->audio_component;
131
132 module_put(acomp->ops->owner);
133 component_unbind_all(dev, acomp);
134 WARN_ON(acomp->ops || acomp->dev);
135}
136
137static const struct component_master_ops hda_component_master_ops = {
138 .bind = hda_component_master_bind,
139 .unbind = hda_component_master_unbind,
140};
141
142static int hda_component_master_match(struct device *dev, void *data)
143{
144 /* i915 is the only supported component */
145 return !strcmp(dev->driver->name, "i915");
146}
Mengdong Line4d9e512014-07-03 17:02:23 +0800147
Imre Deak926981a2015-01-08 17:54:16 +0200148int hda_i915_init(struct hda_intel *hda)
Wang Xingchao99a20082013-05-30 22:07:10 +0800149{
Imre Deakd7055bd2015-01-08 17:54:17 +0200150 struct component_match *match = NULL;
151 struct device *dev = &hda->chip.pci->dev;
152 struct i915_audio_component *acomp = &hda->audio_component;
153 int ret;
Wang Xingchao99a20082013-05-30 22:07:10 +0800154
Imre Deakd7055bd2015-01-08 17:54:17 +0200155 component_match_add(dev, &match, hda_component_master_match, hda);
156 ret = component_master_add_with_match(dev, &hda_component_master_ops,
157 match);
158 if (ret < 0)
159 goto out_err;
160
161 /*
162 * Atm, we don't support deferring the component binding, so make sure
163 * i915 is loaded and that the binding successfully completes.
164 */
165 request_module("i915");
166
167 if (!acomp->ops) {
168 ret = -ENODEV;
169 goto out_master_del;
Wang Xingchao99a20082013-05-30 22:07:10 +0800170 }
171
Imre Deakd7055bd2015-01-08 17:54:17 +0200172 dev_dbg(dev, "bound to i915 component master\n");
Wang Xingchao99a20082013-05-30 22:07:10 +0800173
Imre Deakd7055bd2015-01-08 17:54:17 +0200174 return 0;
175out_master_del:
176 component_master_del(dev, &hda_component_master_ops);
177out_err:
178 dev_err(dev, "failed to add i915 component master (%d)\n", ret);
Mengdong Line4d9e512014-07-03 17:02:23 +0800179
Imre Deakd7055bd2015-01-08 17:54:17 +0200180 return ret;
Wang Xingchao99a20082013-05-30 22:07:10 +0800181}
182
Imre Deak926981a2015-01-08 17:54:16 +0200183int hda_i915_exit(struct hda_intel *hda)
Wang Xingchao99a20082013-05-30 22:07:10 +0800184{
Imre Deakd7055bd2015-01-08 17:54:17 +0200185 struct device *dev = &hda->chip.pci->dev;
186
187 component_master_del(dev, &hda_component_master_ops);
Wang Xingchao99a20082013-05-30 22:07:10 +0800188
189 return 0;
190}