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