1 // SPDX-License-Identifier: GPL-2.0-only 2 3 #include <linux/pci.h> 4 5 #include <drm/drm_drv.h> 6 7 #include "mgag200_drv.h" 8 9 void mgag200_g200eh_init_registers(struct mga_device *mdev) 10 { 11 static const u8 dacvalue[] = { 12 MGAG200_DAC_DEFAULT(0x00, 0xc9, 13 MGA1064_MISC_CTL_VGA8 | MGA1064_MISC_CTL_DAC_RAM_CS, 14 0x00, 0x00, 0x00) 15 }; 16 17 size_t i; 18 19 for (i = 0; i < ARRAY_SIZE(dacvalue); i++) { 20 if ((i <= 0x17) || 21 (i == 0x1b) || 22 (i == 0x1c) || 23 ((i >= 0x1f) && (i <= 0x29)) || 24 ((i >= 0x30) && (i <= 0x37)) || 25 ((i >= 0x44) && (i <= 0x4e))) 26 continue; 27 WREG_DAC(i, dacvalue[i]); 28 } 29 30 mgag200_init_registers(mdev); 31 } 32 33 /* 34 * DRM device 35 */ 36 37 static const struct mgag200_device_info mgag200_g200eh_device_info = 38 MGAG200_DEVICE_INFO_INIT(2048, 2048, 37500, false, 1, 0, false); 39 40 struct mga_device *mgag200_g200eh_device_create(struct pci_dev *pdev, const struct drm_driver *drv, 41 enum mga_type type) 42 { 43 struct mga_device *mdev; 44 struct drm_device *dev; 45 resource_size_t vram_available; 46 int ret; 47 48 mdev = devm_drm_dev_alloc(&pdev->dev, drv, struct mga_device, base); 49 if (IS_ERR(mdev)) 50 return mdev; 51 dev = &mdev->base; 52 53 pci_set_drvdata(pdev, dev); 54 55 ret = mgag200_init_pci_options(pdev, 0x00000120, 0x0000b000); 56 if (ret) 57 return ERR_PTR(ret); 58 59 ret = mgag200_device_preinit(mdev); 60 if (ret) 61 return ERR_PTR(ret); 62 63 ret = mgag200_device_init(mdev, type, &mgag200_g200eh_device_info); 64 if (ret) 65 return ERR_PTR(ret); 66 67 mgag200_g200eh_init_registers(mdev); 68 69 vram_available = mgag200_device_probe_vram(mdev); 70 71 ret = mgag200_modeset_init(mdev, vram_available); 72 if (ret) 73 return ERR_PTR(ret); 74 75 return mdev; 76 } 77