x86: ivybridge: Add a way to get the HDA config setting
authorSimon Glass <sjg@chromium.org>
Sun, 17 Feb 2019 03:24:52 +0000 (20:24 -0700)
committerBin Meng <bmeng.cn@gmail.com>
Wed, 20 Feb 2019 07:27:08 +0000 (15:27 +0800)
Add a way check to whether HD audio is enabled. Use ioctl() to avoid
adding too many unusual operations to PCH.

Signed-off-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Bin Meng <bmeng.cn@gmail.com>
arch/x86/cpu/ivybridge/bd82x6x.c
include/pch.h

index a78bb025440aec946aff24a1b5332ac4a718b6e0..ed9bce641687f812a71c34df997d56e7c17adde0 100644 (file)
 
 DECLARE_GLOBAL_DATA_PTR;
 
-#define GPIO_BASE      0x48
-#define BIOS_CTRL      0xdc
+#define GPIO_BASE              0x48
+#define BIOS_CTRL              0xdc
+
+#define RCBA_AUDIO_CONFIG      0x2030
+#define RCBA_AUDIO_CONFIG_HDA  BIT(31)
+#define RCBA_AUDIO_CONFIG_MASK 0xfe
 
 #ifndef CONFIG_HAVE_FSP
 static int pch_revision_id = -1;
@@ -212,10 +216,29 @@ static int bd82x6x_get_gpio_base(struct udevice *dev, u32 *gbasep)
        return 0;
 }
 
+static int bd82x6x_ioctl(struct udevice *dev, enum pch_req_t req, void *data,
+                        int size)
+{
+       u32 rcba, val;
+
+       switch (req) {
+       case PCH_REQ_HDA_CONFIG:
+               dm_pci_read_config32(dev, PCH_RCBA, &rcba);
+               val = readl(rcba + RCBA_AUDIO_CONFIG);
+               if (!(val & RCBA_AUDIO_CONFIG_HDA))
+                       return -ENOENT;
+
+               return val & RCBA_AUDIO_CONFIG_MASK;
+       default:
+               return -ENOSYS;
+       }
+}
+
 static const struct pch_ops bd82x6x_pch_ops = {
        .get_spi_base   = bd82x6x_pch_get_spi_base,
        .set_spi_protect = bd82x6x_set_spi_protect,
        .get_gpio_base  = bd82x6x_get_gpio_base,
+       .ioctl          = bd82x6x_ioctl,
 };
 
 static const struct udevice_id bd82x6x_ids[] = {
index b8b62d74acbcef5f2f49903b591191c3fb3f4a26..046a5fde3abd65c4f17a0fd5843db9e8e51066b4 100644 (file)
@@ -13,6 +13,9 @@
 
 /* All the supported PCH ioctls */
 enum pch_req_t {
+       /* Returns HDA config info if Azalia V1CTL enabled, -ENOENT if not */
+       PCH_REQ_HDA_CONFIG,
+
        PCH_REQ_TEST1,          /* Test requests for sandbox driver */
        PCH_REQ_TEST2,
        PCH_REQ_TEST3,