1 /* SPDX-License-Identifier: ISC */ 2 3 #include <linux/kernel.h> 4 #include <linux/module.h> 5 #include <linux/platform_device.h> 6 7 #include "mt7603.h" 8 9 static int 10 mt76_wmac_probe(struct platform_device *pdev) 11 { 12 struct resource *res = platform_get_resource(pdev, IORESOURCE_MEM, 0); 13 struct mt7603_dev *dev; 14 void __iomem *mem_base; 15 struct mt76_dev *mdev; 16 int irq; 17 int ret; 18 19 irq = platform_get_irq(pdev, 0); 20 if (irq < 0) 21 return irq; 22 23 mem_base = devm_ioremap_resource(&pdev->dev, res); 24 if (IS_ERR(mem_base)) { 25 dev_err(&pdev->dev, "Failed to get memory resource\n"); 26 return PTR_ERR(mem_base); 27 } 28 29 mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), &mt7603_ops, 30 &mt7603_drv_ops); 31 if (!mdev) 32 return -ENOMEM; 33 34 dev = container_of(mdev, struct mt7603_dev, mt76); 35 mt76_mmio_init(mdev, mem_base); 36 37 mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) | 38 (mt76_rr(dev, MT_HW_REV) & 0xff); 39 dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev); 40 41 ret = devm_request_irq(mdev->dev, irq, mt7603_irq_handler, 42 IRQF_SHARED, KBUILD_MODNAME, dev); 43 if (ret) 44 goto error; 45 46 ret = mt7603_register_device(dev); 47 if (ret) 48 goto error; 49 50 return 0; 51 error: 52 ieee80211_free_hw(mt76_hw(dev)); 53 return ret; 54 } 55 56 static int 57 mt76_wmac_remove(struct platform_device *pdev) 58 { 59 struct mt76_dev *mdev = platform_get_drvdata(pdev); 60 struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76); 61 62 mt7603_unregister_device(dev); 63 64 return 0; 65 } 66 67 static const struct of_device_id of_wmac_match[] = { 68 { .compatible = "mediatek,mt7628-wmac" }, 69 {}, 70 }; 71 72 MODULE_DEVICE_TABLE(of, of_wmac_match); 73 MODULE_FIRMWARE(MT7628_FIRMWARE_E1); 74 MODULE_FIRMWARE(MT7628_FIRMWARE_E2); 75 76 struct platform_driver mt76_wmac_driver = { 77 .probe = mt76_wmac_probe, 78 .remove = mt76_wmac_remove, 79 .driver = { 80 .name = "mt76_wmac", 81 .of_match_table = of_wmac_match, 82 }, 83 }; 84