0001
0002
0003 #include <linux/kernel.h>
0004 #include <linux/module.h>
0005 #include <linux/platform_device.h>
0006
0007 #include "mt7603.h"
0008
0009 static int
0010 mt76_wmac_probe(struct platform_device *pdev)
0011 {
0012 struct mt7603_dev *dev;
0013 void __iomem *mem_base;
0014 struct mt76_dev *mdev;
0015 int irq;
0016 int ret;
0017
0018 irq = platform_get_irq(pdev, 0);
0019 if (irq < 0)
0020 return irq;
0021
0022 mem_base = devm_platform_ioremap_resource(pdev, 0);
0023 if (IS_ERR(mem_base))
0024 return PTR_ERR(mem_base);
0025
0026 mdev = mt76_alloc_device(&pdev->dev, sizeof(*dev), &mt7603_ops,
0027 &mt7603_drv_ops);
0028 if (!mdev)
0029 return -ENOMEM;
0030
0031 dev = container_of(mdev, struct mt7603_dev, mt76);
0032 mt76_mmio_init(mdev, mem_base);
0033
0034 mdev->rev = (mt76_rr(dev, MT_HW_CHIPID) << 16) |
0035 (mt76_rr(dev, MT_HW_REV) & 0xff);
0036 dev_info(mdev->dev, "ASIC revision: %04x\n", mdev->rev);
0037
0038 mt76_wr(dev, MT_INT_MASK_CSR, 0);
0039
0040 ret = devm_request_irq(mdev->dev, irq, mt7603_irq_handler,
0041 IRQF_SHARED, KBUILD_MODNAME, dev);
0042 if (ret)
0043 goto error;
0044
0045 ret = mt7603_register_device(dev);
0046 if (ret)
0047 goto error;
0048
0049 return 0;
0050 error:
0051 ieee80211_free_hw(mt76_hw(dev));
0052 return ret;
0053 }
0054
0055 static int
0056 mt76_wmac_remove(struct platform_device *pdev)
0057 {
0058 struct mt76_dev *mdev = platform_get_drvdata(pdev);
0059 struct mt7603_dev *dev = container_of(mdev, struct mt7603_dev, mt76);
0060
0061 mt7603_unregister_device(dev);
0062
0063 return 0;
0064 }
0065
0066 static const struct of_device_id of_wmac_match[] = {
0067 { .compatible = "mediatek,mt7628-wmac" },
0068 {},
0069 };
0070
0071 MODULE_DEVICE_TABLE(of, of_wmac_match);
0072 MODULE_FIRMWARE(MT7628_FIRMWARE_E1);
0073 MODULE_FIRMWARE(MT7628_FIRMWARE_E2);
0074
0075 struct platform_driver mt76_wmac_driver = {
0076 .probe = mt76_wmac_probe,
0077 .remove = mt76_wmac_remove,
0078 .driver = {
0079 .name = "mt76_wmac",
0080 .of_match_table = of_wmac_match,
0081 },
0082 };