1*6c92544dSBjoern A. Zeeb // SPDX-License-Identifier: ISC
2*6c92544dSBjoern A. Zeeb
3*6c92544dSBjoern A. Zeeb #include <linux/kernel.h>
4*6c92544dSBjoern A. Zeeb #include <linux/module.h>
5*6c92544dSBjoern A. Zeeb #include <linux/pci.h>
6*6c92544dSBjoern A. Zeeb
7*6c92544dSBjoern A. Zeeb #include "mt7603.h"
8*6c92544dSBjoern A. Zeeb
9*6c92544dSBjoern A. Zeeb static const struct pci_device_id mt76pci_device_table[] = {
10*6c92544dSBjoern A. Zeeb { PCI_DEVICE(PCI_VENDOR_ID_MEDIATEK, 0x7603) },
11*6c92544dSBjoern A. Zeeb { },
12*6c92544dSBjoern A. Zeeb };
13*6c92544dSBjoern A. Zeeb
14*6c92544dSBjoern A. Zeeb static int
mt76pci_probe(struct pci_dev * pdev,const struct pci_device_id * id)15*6c92544dSBjoern A. Zeeb mt76pci_probe(struct pci_dev *pdev, const struct pci_device_id *id)
16*6c92544dSBjoern A. Zeeb {
17*6c92544dSBjoern A. Zeeb struct mt7603_dev *dev;
18*6c92544dSBjoern A. Zeeb struct mt76_dev *mdev;
19*6c92544dSBjoern A. Zeeb int ret;
20*6c92544dSBjoern A. Zeeb
21*6c92544dSBjoern A. Zeeb ret = pcim_enable_device(pdev);
22*6c92544dSBjoern A. Zeeb if (ret)
23*6c92544dSBjoern A. Zeeb return ret;
24*6c92544dSBjoern A. Zeeb
25*6c92544dSBjoern A. Zeeb ret = pcim_iomap_regions(pdev, BIT(0), pci_name(pdev));
26*6c92544dSBjoern A. Zeeb if (ret)
27*6c92544dSBjoern A. Zeeb return ret;
28*6c92544dSBjoern A. Zeeb
29*6c92544dSBjoern A. Zeeb pci_set_master(pdev);
30*6c92544dSBjoern A. Zeeb
31*6c92544dSBjoern A. Zeeb ret = dma_set_mask(&pdev->dev, DMA_BIT_MASK(32));
32*6c92544dSBjoern A. Zeeb if (ret)
33*6c92544dSBjoern A. Zeeb return ret;
34*6c92544dSBjoern A. Zeeb
35*6c92544dSBjoern A. Zeeb mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), &mt7603_ops,
36*6c92544dSBjoern A. Zeeb &mt7603_drv_ops);
37*6c92544dSBjoern A. Zeeb if (!mdev)
38*6c92544dSBjoern A. Zeeb return -ENOMEM;
39*6c92544dSBjoern A. Zeeb
40*6c92544dSBjoern A. Zeeb dev = container_of(mdev, struct mt7603_dev, mt76);
41*6c92544dSBjoern A. Zeeb mt76_mmio_init(mdev, pcim_iomap_table(pdev)[0]);
42*6c92544dSBjoern A. Zeeb
43*6c92544dSBjoern A. Zeeb mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) |
44*6c92544dSBjoern A. Zeeb (mt76_rr(dev, MT_HW_REV) & 0xff);
45*6c92544dSBjoern A. Zeeb dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
46*6c92544dSBjoern A. Zeeb
47*6c92544dSBjoern A. Zeeb mt76_wr(dev, MT_INT_MASK_CSR, 0);
48*6c92544dSBjoern A. Zeeb
49*6c92544dSBjoern A. Zeeb ret = devm_request_irq(mdev->dev, pdev->irq, mt7603_irq_handler,
50*6c92544dSBjoern A. Zeeb IRQF_SHARED, KBUILD_MODNAME, dev);
51*6c92544dSBjoern A. Zeeb if (ret)
52*6c92544dSBjoern A. Zeeb goto error;
53*6c92544dSBjoern A. Zeeb
54*6c92544dSBjoern A. Zeeb ret = mt7603_register_device(dev);
55*6c92544dSBjoern A. Zeeb if (ret)
56*6c92544dSBjoern A. Zeeb goto error;
57*6c92544dSBjoern A. Zeeb
58*6c92544dSBjoern A. Zeeb return 0;
59*6c92544dSBjoern A. Zeeb error:
60*6c92544dSBjoern A. Zeeb mt76_free_device(&dev->mt76);
61*6c92544dSBjoern A. Zeeb
62*6c92544dSBjoern A. Zeeb return ret;
63*6c92544dSBjoern A. Zeeb }
64*6c92544dSBjoern A. Zeeb
65*6c92544dSBjoern A. Zeeb static void
mt76pci_remove(struct pci_dev * pdev)66*6c92544dSBjoern A. Zeeb mt76pci_remove(struct pci_dev *pdev)
67*6c92544dSBjoern A. Zeeb {
68*6c92544dSBjoern A. Zeeb struct mt76_dev *mdev = pci_get_drvdata(pdev);
69*6c92544dSBjoern A. Zeeb struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
70*6c92544dSBjoern A. Zeeb
71*6c92544dSBjoern A. Zeeb mt7603_unregister_device(dev);
72*6c92544dSBjoern A. Zeeb }
73*6c92544dSBjoern A. Zeeb
74*6c92544dSBjoern A. Zeeb MODULE_DEVICE_TABLE(pci, mt76pci_device_table);
75*6c92544dSBjoern A. Zeeb MODULE_FIRMWARE(MT7603_FIRMWARE_E1);
76*6c92544dSBjoern A. Zeeb MODULE_FIRMWARE(MT7603_FIRMWARE_E2);
77*6c92544dSBjoern A. Zeeb
78*6c92544dSBjoern A. Zeeb struct pci_driver mt7603_pci_driver = {
79*6c92544dSBjoern A. Zeeb .name = KBUILD_MODNAME,
80*6c92544dSBjoern A. Zeeb .id_table = mt76pci_device_table,
81*6c92544dSBjoern A. Zeeb .probe = mt76pci_probe,
82*6c92544dSBjoern A. Zeeb .remove = mt76pci_remove,
83*6c92544dSBjoern A. Zeeb };
84