Linux Audio

Check our new training course

Loading...
v3.1
  1/*
  2 * Sonics Silicon Backplane
  3 * PCI Hostdevice wrapper
  4 *
  5 * Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
  6 * Copyright (c) 2005 Stefano Brivio <st3@riseup.net>
  7 * Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
  8 * Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
  9 * Copyright (c) 2005-2007 Michael Buesch <m@bues.ch>
 10 *
 11 * Licensed under the GNU/GPL. See COPYING for details.
 12 */
 13
 14#include <linux/pci.h>
 
 15#include <linux/slab.h>
 16#include <linux/ssb/ssb.h>
 17
 18
 19#ifdef CONFIG_PM
 20static int ssb_pcihost_suspend(struct pci_dev *dev, pm_message_t state)
 21{
 22	struct ssb_bus *ssb = pci_get_drvdata(dev);
 23	int err;
 24
 25	err = ssb_bus_suspend(ssb);
 26	if (err)
 27		return err;
 28	pci_save_state(dev);
 29	pci_disable_device(dev);
 30	pci_set_power_state(dev, pci_choose_state(dev, state));
 31
 32	return 0;
 33}
 34
 35static int ssb_pcihost_resume(struct pci_dev *dev)
 36{
 37	struct ssb_bus *ssb = pci_get_drvdata(dev);
 38	int err;
 39
 40	pci_set_power_state(dev, 0);
 41	err = pci_enable_device(dev);
 42	if (err)
 43		return err;
 44	pci_restore_state(dev);
 45	err = ssb_bus_resume(ssb);
 46	if (err)
 47		return err;
 48
 49	return 0;
 50}
 51#else /* CONFIG_PM */
 52# define ssb_pcihost_suspend	NULL
 53# define ssb_pcihost_resume	NULL
 54#endif /* CONFIG_PM */
 55
 56static int __devinit ssb_pcihost_probe(struct pci_dev *dev,
 57				       const struct pci_device_id *id)
 58{
 59	struct ssb_bus *ssb;
 60	int err = -ENOMEM;
 61	const char *name;
 62	u32 val;
 63
 64	ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
 65	if (!ssb)
 66		goto out;
 67	err = pci_enable_device(dev);
 68	if (err)
 69		goto err_kfree_ssb;
 70	name = dev_name(&dev->dev);
 71	if (dev->driver && dev->driver->name)
 72		name = dev->driver->name;
 73	err = pci_request_regions(dev, name);
 74	if (err)
 75		goto err_pci_disable;
 76	pci_set_master(dev);
 77
 78	/* Disable the RETRY_TIMEOUT register (0x41) to keep
 79	 * PCI Tx retries from interfering with C3 CPU state */
 80	pci_read_config_dword(dev, 0x40, &val);
 81	if ((val & 0x0000ff00) != 0)
 82		pci_write_config_dword(dev, 0x40, val & 0xffff00ff);
 83
 84	err = ssb_bus_pcibus_register(ssb, dev);
 85	if (err)
 86		goto err_pci_release_regions;
 87
 88	pci_set_drvdata(dev, ssb);
 89
 90out:
 91	return err;
 92
 93err_pci_release_regions:
 94	pci_release_regions(dev);
 95err_pci_disable:
 96	pci_disable_device(dev);
 97err_kfree_ssb:
 98	kfree(ssb);
 99	return err;
100}
101
102static void ssb_pcihost_remove(struct pci_dev *dev)
103{
104	struct ssb_bus *ssb = pci_get_drvdata(dev);
105
106	ssb_bus_unregister(ssb);
107	pci_release_regions(dev);
108	pci_disable_device(dev);
109	kfree(ssb);
110	pci_set_drvdata(dev, NULL);
111}
112
113int __devinit ssb_pcihost_register(struct pci_driver *driver)
114{
115	driver->probe = ssb_pcihost_probe;
116	driver->remove = ssb_pcihost_remove;
117	driver->suspend = ssb_pcihost_suspend;
118	driver->resume = ssb_pcihost_resume;
119
120	return pci_register_driver(driver);
121}
122EXPORT_SYMBOL(ssb_pcihost_register);
v3.5.6
  1/*
  2 * Sonics Silicon Backplane
  3 * PCI Hostdevice wrapper
  4 *
  5 * Copyright (c) 2005 Martin Langer <martin-langer@gmx.de>
  6 * Copyright (c) 2005 Stefano Brivio <st3@riseup.net>
  7 * Copyright (c) 2005 Danny van Dyk <kugelfang@gentoo.org>
  8 * Copyright (c) 2005 Andreas Jaggi <andreas.jaggi@waterwave.ch>
  9 * Copyright (c) 2005-2007 Michael Buesch <m@bues.ch>
 10 *
 11 * Licensed under the GNU/GPL. See COPYING for details.
 12 */
 13
 14#include <linux/pci.h>
 15#include <linux/export.h>
 16#include <linux/slab.h>
 17#include <linux/ssb/ssb.h>
 18
 19
 20#ifdef CONFIG_PM
 21static int ssb_pcihost_suspend(struct pci_dev *dev, pm_message_t state)
 22{
 23	struct ssb_bus *ssb = pci_get_drvdata(dev);
 24	int err;
 25
 26	err = ssb_bus_suspend(ssb);
 27	if (err)
 28		return err;
 29	pci_save_state(dev);
 30	pci_disable_device(dev);
 31	pci_set_power_state(dev, pci_choose_state(dev, state));
 32
 33	return 0;
 34}
 35
 36static int ssb_pcihost_resume(struct pci_dev *dev)
 37{
 38	struct ssb_bus *ssb = pci_get_drvdata(dev);
 39	int err;
 40
 41	pci_set_power_state(dev, 0);
 42	err = pci_enable_device(dev);
 43	if (err)
 44		return err;
 45	pci_restore_state(dev);
 46	err = ssb_bus_resume(ssb);
 47	if (err)
 48		return err;
 49
 50	return 0;
 51}
 52#else /* CONFIG_PM */
 53# define ssb_pcihost_suspend	NULL
 54# define ssb_pcihost_resume	NULL
 55#endif /* CONFIG_PM */
 56
 57static int __devinit ssb_pcihost_probe(struct pci_dev *dev,
 58				       const struct pci_device_id *id)
 59{
 60	struct ssb_bus *ssb;
 61	int err = -ENOMEM;
 62	const char *name;
 63	u32 val;
 64
 65	ssb = kzalloc(sizeof(*ssb), GFP_KERNEL);
 66	if (!ssb)
 67		goto out;
 68	err = pci_enable_device(dev);
 69	if (err)
 70		goto err_kfree_ssb;
 71	name = dev_name(&dev->dev);
 72	if (dev->driver && dev->driver->name)
 73		name = dev->driver->name;
 74	err = pci_request_regions(dev, name);
 75	if (err)
 76		goto err_pci_disable;
 77	pci_set_master(dev);
 78
 79	/* Disable the RETRY_TIMEOUT register (0x41) to keep
 80	 * PCI Tx retries from interfering with C3 CPU state */
 81	pci_read_config_dword(dev, 0x40, &val);
 82	if ((val & 0x0000ff00) != 0)
 83		pci_write_config_dword(dev, 0x40, val & 0xffff00ff);
 84
 85	err = ssb_bus_pcibus_register(ssb, dev);
 86	if (err)
 87		goto err_pci_release_regions;
 88
 89	pci_set_drvdata(dev, ssb);
 90
 91out:
 92	return err;
 93
 94err_pci_release_regions:
 95	pci_release_regions(dev);
 96err_pci_disable:
 97	pci_disable_device(dev);
 98err_kfree_ssb:
 99	kfree(ssb);
100	return err;
101}
102
103static void ssb_pcihost_remove(struct pci_dev *dev)
104{
105	struct ssb_bus *ssb = pci_get_drvdata(dev);
106
107	ssb_bus_unregister(ssb);
108	pci_release_regions(dev);
109	pci_disable_device(dev);
110	kfree(ssb);
111	pci_set_drvdata(dev, NULL);
112}
113
114int __devinit ssb_pcihost_register(struct pci_driver *driver)
115{
116	driver->probe = ssb_pcihost_probe;
117	driver->remove = ssb_pcihost_remove;
118	driver->suspend = ssb_pcihost_suspend;
119	driver->resume = ssb_pcihost_resume;
120
121	return pci_register_driver(driver);
122}
123EXPORT_SYMBOL(ssb_pcihost_register);