Merge tag 'drm-intel-next-2019-04-04' into gvt-next
[sfrench/cifs-2.6.git] / sound / hda / hdac_i915.c
1 /*
2  *  hdac_i915.c - routines for sync between HD-A core and i915 display driver
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
15 #include <linux/init.h>
16 #include <linux/module.h>
17 #include <linux/pci.h>
18 #include <sound/core.h>
19 #include <sound/hdaudio.h>
20 #include <sound/hda_i915.h>
21 #include <sound/hda_register.h>
22
23 static struct completion bind_complete;
24
25 #define CONTROLLER_IN_GPU(pci) (((pci)->device == 0x0a0c) || \
26                                 ((pci)->device == 0x0c0c) || \
27                                 ((pci)->device == 0x0d0c) || \
28                                 ((pci)->device == 0x160c))
29
30 /**
31  * snd_hdac_i915_set_bclk - Reprogram BCLK for HSW/BDW
32  * @bus: HDA core bus
33  *
34  * Intel HSW/BDW display HDA controller is in GPU. Both its power and link BCLK
35  * depends on GPU. Two Extended Mode registers EM4 (M value) and EM5 (N Value)
36  * are used to convert CDClk (Core Display Clock) to 24MHz BCLK:
37  * BCLK = CDCLK * M / N
38  * The values will be lost when the display power well is disabled and need to
39  * be restored to avoid abnormal playback speed.
40  *
41  * Call this function at initializing and changing power well, as well as
42  * at ELD notifier for the hotplug.
43  */
44 void snd_hdac_i915_set_bclk(struct hdac_bus *bus)
45 {
46         struct drm_audio_component *acomp = bus->audio_component;
47         struct pci_dev *pci = to_pci_dev(bus->dev);
48         int cdclk_freq;
49         unsigned int bclk_m, bclk_n;
50
51         if (!acomp || !acomp->ops || !acomp->ops->get_cdclk_freq)
52                 return; /* only for i915 binding */
53         if (!CONTROLLER_IN_GPU(pci))
54                 return; /* only HSW/BDW */
55
56         cdclk_freq = acomp->ops->get_cdclk_freq(acomp->dev);
57         switch (cdclk_freq) {
58         case 337500:
59                 bclk_m = 16;
60                 bclk_n = 225;
61                 break;
62
63         case 450000:
64         default: /* default CDCLK 450MHz */
65                 bclk_m = 4;
66                 bclk_n = 75;
67                 break;
68
69         case 540000:
70                 bclk_m = 4;
71                 bclk_n = 90;
72                 break;
73
74         case 675000:
75                 bclk_m = 8;
76                 bclk_n = 225;
77                 break;
78         }
79
80         snd_hdac_chip_writew(bus, HSW_EM4, bclk_m);
81         snd_hdac_chip_writew(bus, HSW_EM5, bclk_n);
82 }
83 EXPORT_SYMBOL_GPL(snd_hdac_i915_set_bclk);
84
85 static int i915_component_master_match(struct device *dev, int subcomponent,
86                                        void *data)
87 {
88         return !strcmp(dev->driver->name, "i915") &&
89                subcomponent == I915_COMPONENT_AUDIO;
90 }
91
92 /* check whether intel graphics is present */
93 static bool i915_gfx_present(void)
94 {
95         static const struct pci_device_id ids[] = {
96                 { PCI_DEVICE(PCI_VENDOR_ID_INTEL, PCI_ANY_ID),
97                   .class = PCI_BASE_CLASS_DISPLAY << 16,
98                   .class_mask = 0xff << 16 },
99                 {}
100         };
101         return pci_dev_present(ids);
102 }
103
104 static int i915_master_bind(struct device *dev,
105                             struct drm_audio_component *acomp)
106 {
107         complete_all(&bind_complete);
108         /* clear audio_ops here as it was needed only for completion call */
109         acomp->audio_ops = NULL;
110         return 0;
111 }
112
113 static const struct drm_audio_component_audio_ops i915_init_ops = {
114         .master_bind = i915_master_bind
115 };
116
117 /**
118  * snd_hdac_i915_init - Initialize i915 audio component
119  * @bus: HDA core bus
120  *
121  * This function is supposed to be used only by a HD-audio controller
122  * driver that needs the interaction with i915 graphics.
123  *
124  * This function initializes and sets up the audio component to communicate
125  * with i915 graphics driver.
126  *
127  * Returns zero for success or a negative error code.
128  */
129 int snd_hdac_i915_init(struct hdac_bus *bus)
130 {
131         struct drm_audio_component *acomp;
132         int err;
133
134         if (!i915_gfx_present())
135                 return -ENODEV;
136
137         init_completion(&bind_complete);
138
139         err = snd_hdac_acomp_init(bus, &i915_init_ops,
140                                   i915_component_master_match,
141                                   sizeof(struct i915_audio_component) - sizeof(*acomp));
142         if (err < 0)
143                 return err;
144         acomp = bus->audio_component;
145         if (!acomp)
146                 return -ENODEV;
147         if (!acomp->ops) {
148                 request_module("i915");
149                 /* 60s timeout */
150                 wait_for_completion_timeout(&bind_complete,
151                                             msecs_to_jiffies(60 * 1000));
152         }
153         if (!acomp->ops) {
154                 dev_info(bus->dev, "couldn't bind with audio component\n");
155                 snd_hdac_acomp_exit(bus);
156                 return -ENODEV;
157         }
158         return 0;
159 }
160 EXPORT_SYMBOL_GPL(snd_hdac_i915_init);