mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	i2c: pasemi: Split pci driver to its own file
Split off the PCI driver so that we can reuse common code for the platform driver. Reviewed-by: Arnd Bergmann <arnd@arndb.de> Signed-off-by: Sven Peter <sven@svenpeter.dev> Acked-by: Olof Johansson <olof@lixom.net> Tested-by: Christian Zigotzky <chzigotzky@xenosoft.de> Signed-off-by: Wolfram Sang <wsa@kernel.org>
This commit is contained in:
		
							parent
							
								
									6adb00c7f0
								
							
						
					
					
						commit
						9bc5f4f660
					
				
					 4 changed files with 118 additions and 86 deletions
				
			
		| 
						 | 
					@ -84,6 +84,7 @@ obj-$(CONFIG_I2C_NPCM7XX)	+= i2c-npcm7xx.o
 | 
				
			||||||
obj-$(CONFIG_I2C_OCORES)	+= i2c-ocores.o
 | 
					obj-$(CONFIG_I2C_OCORES)	+= i2c-ocores.o
 | 
				
			||||||
obj-$(CONFIG_I2C_OMAP)		+= i2c-omap.o
 | 
					obj-$(CONFIG_I2C_OMAP)		+= i2c-omap.o
 | 
				
			||||||
obj-$(CONFIG_I2C_OWL)		+= i2c-owl.o
 | 
					obj-$(CONFIG_I2C_OWL)		+= i2c-owl.o
 | 
				
			||||||
 | 
					i2c-pasemi-objs := i2c-pasemi-core.o i2c-pasemi-pci.o
 | 
				
			||||||
obj-$(CONFIG_I2C_PASEMI)	+= i2c-pasemi.o
 | 
					obj-$(CONFIG_I2C_PASEMI)	+= i2c-pasemi.o
 | 
				
			||||||
obj-$(CONFIG_I2C_PCA_PLATFORM)	+= i2c-pca-platform.o
 | 
					obj-$(CONFIG_I2C_PCA_PLATFORM)	+= i2c-pca-platform.o
 | 
				
			||||||
obj-$(CONFIG_I2C_PNX)		+= i2c-pnx.o
 | 
					obj-$(CONFIG_I2C_PNX)		+= i2c-pnx.o
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -15,15 +15,7 @@
 | 
				
			||||||
#include <linux/slab.h>
 | 
					#include <linux/slab.h>
 | 
				
			||||||
#include <linux/io.h>
 | 
					#include <linux/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static struct pci_driver pasemi_smb_driver;
 | 
					#include "i2c-pasemi-core.h"
 | 
				
			||||||
 | 
					 | 
				
			||||||
struct pasemi_smbus {
 | 
					 | 
				
			||||||
	struct device           *dev;
 | 
					 | 
				
			||||||
	struct i2c_adapter	 adapter;
 | 
					 | 
				
			||||||
	void __iomem		*ioaddr;
 | 
					 | 
				
			||||||
	unsigned long		 base;
 | 
					 | 
				
			||||||
	int			 size;
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Register offsets */
 | 
					/* Register offsets */
 | 
				
			||||||
#define REG_MTXFIFO	0x00
 | 
					#define REG_MTXFIFO	0x00
 | 
				
			||||||
| 
						 | 
					@ -329,7 +321,7 @@ static const struct i2c_algorithm smbus_algorithm = {
 | 
				
			||||||
	.functionality	= pasemi_smb_func,
 | 
						.functionality	= pasemi_smb_func,
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int pasemi_i2c_common_probe(struct pasemi_smbus *smbus)
 | 
					int pasemi_i2c_common_probe(struct pasemi_smbus *smbus)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int error;
 | 
						int error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -352,79 +344,3 @@ static int pasemi_i2c_common_probe(struct pasemi_smbus *smbus)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
						return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
static int pasemi_smb_probe(struct pci_dev *dev,
 | 
					 | 
				
			||||||
				      const struct pci_device_id *id)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct pasemi_smbus *smbus;
 | 
					 | 
				
			||||||
	int error;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!(pci_resource_flags(dev, 0) & IORESOURCE_IO))
 | 
					 | 
				
			||||||
		return -ENODEV;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	smbus = kzalloc(sizeof(struct pasemi_smbus), GFP_KERNEL);
 | 
					 | 
				
			||||||
	if (!smbus)
 | 
					 | 
				
			||||||
		return -ENOMEM;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	smbus->dev = &dev->dev;
 | 
					 | 
				
			||||||
	smbus->base = pci_resource_start(dev, 0);
 | 
					 | 
				
			||||||
	smbus->size = pci_resource_len(dev, 0);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	if (!request_region(smbus->base, smbus->size,
 | 
					 | 
				
			||||||
			    pasemi_smb_driver.name)) {
 | 
					 | 
				
			||||||
		error = -EBUSY;
 | 
					 | 
				
			||||||
		goto out_kfree;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	smbus->ioaddr = pci_iomap(dev, 0, 0);
 | 
					 | 
				
			||||||
	if (!smbus->ioaddr) {
 | 
					 | 
				
			||||||
		error = -EBUSY;
 | 
					 | 
				
			||||||
		goto out_release_region;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	int error = pasemi_i2c_common_probe(smbus);
 | 
					 | 
				
			||||||
	if (error)
 | 
					 | 
				
			||||||
		goto out_ioport_unmap;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	pci_set_drvdata(dev, smbus);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	return 0;
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 out_ioport_unmap:
 | 
					 | 
				
			||||||
	pci_iounmap(dev, smbus->ioaddr);
 | 
					 | 
				
			||||||
 out_release_region:
 | 
					 | 
				
			||||||
	release_region(smbus->base, smbus->size);
 | 
					 | 
				
			||||||
 out_kfree:
 | 
					 | 
				
			||||||
	kfree(smbus);
 | 
					 | 
				
			||||||
	return error;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void pasemi_smb_remove(struct pci_dev *dev)
 | 
					 | 
				
			||||||
{
 | 
					 | 
				
			||||||
	struct pasemi_smbus *smbus = pci_get_drvdata(dev);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
	i2c_del_adapter(&smbus->adapter);
 | 
					 | 
				
			||||||
	pci_iounmap(dev, smbus->ioaddr);
 | 
					 | 
				
			||||||
	release_region(smbus->base, smbus->size);
 | 
					 | 
				
			||||||
	kfree(smbus);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static const struct pci_device_id pasemi_smb_ids[] = {
 | 
					 | 
				
			||||||
	{ PCI_DEVICE(0x1959, 0xa003) },
 | 
					 | 
				
			||||||
	{ 0, }
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MODULE_DEVICE_TABLE(pci, pasemi_smb_ids);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static struct pci_driver pasemi_smb_driver = {
 | 
					 | 
				
			||||||
	.name		= "i2c-pasemi",
 | 
					 | 
				
			||||||
	.id_table	= pasemi_smb_ids,
 | 
					 | 
				
			||||||
	.probe		= pasemi_smb_probe,
 | 
					 | 
				
			||||||
	.remove		= pasemi_smb_remove,
 | 
					 | 
				
			||||||
};
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
module_pci_driver(pasemi_smb_driver);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
MODULE_LICENSE("GPL");
 | 
					 | 
				
			||||||
MODULE_AUTHOR ("Olof Johansson <olof@lixom.net>");
 | 
					 | 
				
			||||||
MODULE_DESCRIPTION("PA Semi PWRficient SMBus driver");
 | 
					 | 
				
			||||||
							
								
								
									
										19
									
								
								drivers/i2c/busses/i2c-pasemi-core.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								drivers/i2c/busses/i2c-pasemi-core.h
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					/* SPDX-License-Identifier: GPL-2.0 */
 | 
				
			||||||
 | 
					#include <linux/atomic.h>
 | 
				
			||||||
 | 
					#include <linux/clk.h>
 | 
				
			||||||
 | 
					#include <linux/delay.h>
 | 
				
			||||||
 | 
					#include <linux/device.h>
 | 
				
			||||||
 | 
					#include <linux/i2c.h>
 | 
				
			||||||
 | 
					#include <linux/i2c-smbus.h>
 | 
				
			||||||
 | 
					#include <linux/io.h>
 | 
				
			||||||
 | 
					#include <linux/kernel.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct pasemi_smbus {
 | 
				
			||||||
 | 
						struct device		*dev;
 | 
				
			||||||
 | 
						struct i2c_adapter	 adapter;
 | 
				
			||||||
 | 
						void __iomem		*ioaddr;
 | 
				
			||||||
 | 
						unsigned long		 base;
 | 
				
			||||||
 | 
						int			 size;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int pasemi_i2c_common_probe(struct pasemi_smbus *smbus);
 | 
				
			||||||
							
								
								
									
										96
									
								
								drivers/i2c/busses/i2c-pasemi-pci.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										96
									
								
								drivers/i2c/busses/i2c-pasemi-pci.c
									
									
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,96 @@
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: GPL-2.0-only
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					 * Copyright (C) 2006-2007 PA Semi, Inc
 | 
				
			||||||
 | 
					 *
 | 
				
			||||||
 | 
					 * SMBus host driver for PA Semi PWRficient
 | 
				
			||||||
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <linux/module.h>
 | 
				
			||||||
 | 
					#include <linux/pci.h>
 | 
				
			||||||
 | 
					#include <linux/kernel.h>
 | 
				
			||||||
 | 
					#include <linux/stddef.h>
 | 
				
			||||||
 | 
					#include <linux/sched.h>
 | 
				
			||||||
 | 
					#include <linux/i2c.h>
 | 
				
			||||||
 | 
					#include <linux/delay.h>
 | 
				
			||||||
 | 
					#include <linux/slab.h>
 | 
				
			||||||
 | 
					#include <linux/io.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "i2c-pasemi-core.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct pci_driver pasemi_smb_pci_driver;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static int pasemi_smb_pci_probe(struct pci_dev *dev,
 | 
				
			||||||
 | 
									      const struct pci_device_id *id)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pasemi_smbus *smbus;
 | 
				
			||||||
 | 
						int error;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!(pci_resource_flags(dev, 0) & IORESOURCE_IO))
 | 
				
			||||||
 | 
							return -ENODEV;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						smbus = kzalloc(sizeof(struct pasemi_smbus), GFP_KERNEL);
 | 
				
			||||||
 | 
						if (!smbus)
 | 
				
			||||||
 | 
							return -ENOMEM;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						smbus->dev = &dev->dev;
 | 
				
			||||||
 | 
						smbus->base = pci_resource_start(dev, 0);
 | 
				
			||||||
 | 
						smbus->size = pci_resource_len(dev, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (!request_region(smbus->base, smbus->size,
 | 
				
			||||||
 | 
								    pasemi_smb_pci_driver.name)) {
 | 
				
			||||||
 | 
							error = -EBUSY;
 | 
				
			||||||
 | 
							goto out_kfree;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						smbus->ioaddr = pci_iomap(dev, 0, 0);
 | 
				
			||||||
 | 
						if (!smbus->ioaddr) {
 | 
				
			||||||
 | 
							error = -EBUSY;
 | 
				
			||||||
 | 
							goto out_release_region;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						error = pasemi_i2c_common_probe(smbus);
 | 
				
			||||||
 | 
						if (error)
 | 
				
			||||||
 | 
							goto out_ioport_unmap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						pci_set_drvdata(dev, smbus);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 out_ioport_unmap:
 | 
				
			||||||
 | 
						pci_iounmap(dev, smbus->ioaddr);
 | 
				
			||||||
 | 
					 out_release_region:
 | 
				
			||||||
 | 
						release_region(smbus->base, smbus->size);
 | 
				
			||||||
 | 
					 out_kfree:
 | 
				
			||||||
 | 
						kfree(smbus);
 | 
				
			||||||
 | 
						return error;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void pasemi_smb_pci_remove(struct pci_dev *dev)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						struct pasemi_smbus *smbus = pci_get_drvdata(dev);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						i2c_del_adapter(&smbus->adapter);
 | 
				
			||||||
 | 
						pci_iounmap(dev, smbus->ioaddr);
 | 
				
			||||||
 | 
						release_region(smbus->base, smbus->size);
 | 
				
			||||||
 | 
						kfree(smbus);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static const struct pci_device_id pasemi_smb_pci_ids[] = {
 | 
				
			||||||
 | 
						{ PCI_DEVICE(0x1959, 0xa003) },
 | 
				
			||||||
 | 
						{ 0, }
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MODULE_DEVICE_TABLE(pci, pasemi_smb_pci_ids);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static struct pci_driver pasemi_smb_pci_driver = {
 | 
				
			||||||
 | 
						.name		= "i2c-pasemi",
 | 
				
			||||||
 | 
						.id_table	= pasemi_smb_pci_ids,
 | 
				
			||||||
 | 
						.probe		= pasemi_smb_pci_probe,
 | 
				
			||||||
 | 
						.remove		= pasemi_smb_pci_remove,
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					module_pci_driver(pasemi_smb_pci_driver);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					MODULE_LICENSE("GPL");
 | 
				
			||||||
 | 
					MODULE_AUTHOR("Olof Johansson <olof@lixom.net>");
 | 
				
			||||||
 | 
					MODULE_DESCRIPTION("PA Semi PWRficient SMBus driver");
 | 
				
			||||||
		Loading…
	
		Reference in a new issue