18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*** -*- linux-c -*- **********************************************************
38c2ecf20Sopenharmony_ci
48c2ecf20Sopenharmony_ci     Driver for Atmel at76c502 at76c504 and at76c506 wireless cards.
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci         Copyright 2004 Simon Kelley.
78c2ecf20Sopenharmony_ci
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci******************************************************************************/
108c2ecf20Sopenharmony_ci#include <linux/pci.h>
118c2ecf20Sopenharmony_ci#include <linux/kernel.h>
128c2ecf20Sopenharmony_ci#include <linux/module.h>
138c2ecf20Sopenharmony_ci#include <linux/netdevice.h>
148c2ecf20Sopenharmony_ci#include "atmel.h"
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ciMODULE_AUTHOR("Simon Kelley");
178c2ecf20Sopenharmony_ciMODULE_DESCRIPTION("Support for Atmel at76c50x 802.11 wireless ethernet cards.");
188c2ecf20Sopenharmony_ciMODULE_LICENSE("GPL");
198c2ecf20Sopenharmony_ciMODULE_SUPPORTED_DEVICE("Atmel at76c506 PCI wireless cards");
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_cistatic const struct pci_device_id card_ids[] = {
228c2ecf20Sopenharmony_ci	{ 0x1114, 0x0506, PCI_ANY_ID, PCI_ANY_ID },
238c2ecf20Sopenharmony_ci	{ 0, }
248c2ecf20Sopenharmony_ci};
258c2ecf20Sopenharmony_ci
268c2ecf20Sopenharmony_ciMODULE_DEVICE_TABLE(pci, card_ids);
278c2ecf20Sopenharmony_ci
288c2ecf20Sopenharmony_cistatic int atmel_pci_probe(struct pci_dev *, const struct pci_device_id *);
298c2ecf20Sopenharmony_cistatic void atmel_pci_remove(struct pci_dev *);
308c2ecf20Sopenharmony_ci
318c2ecf20Sopenharmony_cistatic struct pci_driver atmel_driver = {
328c2ecf20Sopenharmony_ci	.name     = "atmel",
338c2ecf20Sopenharmony_ci	.id_table = card_ids,
348c2ecf20Sopenharmony_ci	.probe    = atmel_pci_probe,
358c2ecf20Sopenharmony_ci	.remove   = atmel_pci_remove,
368c2ecf20Sopenharmony_ci};
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_cistatic int atmel_pci_probe(struct pci_dev *pdev,
408c2ecf20Sopenharmony_ci				     const struct pci_device_id *pent)
418c2ecf20Sopenharmony_ci{
428c2ecf20Sopenharmony_ci	struct net_device *dev;
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ci	if (pci_enable_device(pdev))
458c2ecf20Sopenharmony_ci		return -ENODEV;
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_ci	pci_set_master(pdev);
488c2ecf20Sopenharmony_ci
498c2ecf20Sopenharmony_ci	dev = init_atmel_card(pdev->irq, pdev->resource[1].start,
508c2ecf20Sopenharmony_ci			      ATMEL_FW_TYPE_506,
518c2ecf20Sopenharmony_ci			      &pdev->dev, NULL, NULL);
528c2ecf20Sopenharmony_ci	if (!dev) {
538c2ecf20Sopenharmony_ci		pci_disable_device(pdev);
548c2ecf20Sopenharmony_ci		return -ENODEV;
558c2ecf20Sopenharmony_ci	}
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci	pci_set_drvdata(pdev, dev);
588c2ecf20Sopenharmony_ci	return 0;
598c2ecf20Sopenharmony_ci}
608c2ecf20Sopenharmony_ci
618c2ecf20Sopenharmony_cistatic void atmel_pci_remove(struct pci_dev *pdev)
628c2ecf20Sopenharmony_ci{
638c2ecf20Sopenharmony_ci	stop_atmel_card(pci_get_drvdata(pdev));
648c2ecf20Sopenharmony_ci}
658c2ecf20Sopenharmony_ci
668c2ecf20Sopenharmony_cimodule_pci_driver(atmel_driver);
67