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