Przeglądaj źródła

i2c-designware: Fix build error if CONFIG_I2C_DESIGNWARE_PLATFORM=y && CONFIG_I2C_DESIGNWARE_PCI=y

This patch adds config I2C_DESIGNWARE_CORE in Kconfig, and let
I2C_DESIGNWARE_PLATFORM and I2C_DESIGNWARE_PCI select I2C_DESIGNWARE_CORE.

Because both I2C_DESIGNWARE_PLATFORM and I2C_DESIGNWARE_PCI can be built as
built-in or module, we also need to export the functions in i2c-designware-core.

This fixes below build error when CONFIG_I2C_DESIGNWARE_PLATFORM=y &&
CONFIG_I2C_DESIGNWARE_PCI=y:

  LD      drivers/i2c/busses/built-in.o
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_clear_int':
i2c-designware-core.c:(.text+0xa10): multiple definition of `i2c_dw_clear_int'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x928): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_init':
i2c-designware-core.c:(.text+0x178): multiple definition of `i2c_dw_init'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x90): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `dw_readl':
i2c-designware-core.c:(.text+0xe8): multiple definition of `dw_readl'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x0): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_isr':
i2c-designware-core.c:(.text+0x724): multiple definition of `i2c_dw_isr'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x63c): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_xfer':
i2c-designware-core.c:(.text+0x4b0): multiple definition of `i2c_dw_xfer'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x3c8): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_is_enabled':
i2c-designware-core.c:(.text+0x9d4): multiple definition of `i2c_dw_is_enabled'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x8ec): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `dw_writel':
i2c-designware-core.c:(.text+0x124): multiple definition of `dw_writel'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x3c): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_xfer_msg':
i2c-designware-core.c:(.text+0x2e8): multiple definition of `i2c_dw_xfer_msg'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x200): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_enable':
i2c-designware-core.c:(.text+0x9c8): multiple definition of `i2c_dw_enable'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x8e0): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_read_comp_param':
i2c-designware-core.c:(.text+0xa24): multiple definition of `i2c_dw_read_comp_param'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x93c): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_disable':
i2c-designware-core.c:(.text+0x9dc): multiple definition of `i2c_dw_disable'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x8f4): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_func':
i2c-designware-core.c:(.text+0x710): multiple definition of `i2c_dw_func'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x628): first defined here
drivers/i2c/busses/i2c-designware-pci.o: In function `i2c_dw_disable_int':
i2c-designware-core.c:(.text+0xa18): multiple definition of `i2c_dw_disable_int'
drivers/i2c/busses/i2c-designware-platform.o:i2c-designware-platdrv.c:(.text+0x930): first defined here
make[3]: *** [drivers/i2c/busses/built-in.o] Error 1
make[2]: *** [drivers/i2c/busses] Error 2
make[1]: *** [drivers/i2c] Error 2
make: *** [drivers] Error 2

Signed-off-by: Axel Lin <axel.lin@gmail.com>
Signed-off-by: Jean Delvare <khali@linux-fr.org>
Tested-by: Jiri Slaby <jslaby@suse.cz>
Cc: stable@vger.kernel.org [3.2+]
Axel Lin 13 lat temu
rodzic
commit
e68bb91baa

+ 5 - 0
drivers/i2c/busses/Kconfig

@@ -355,9 +355,13 @@ config I2C_DAVINCI
 	  devices such as DaVinci NIC.
 	  devices such as DaVinci NIC.
 	  For details please see http://www.ti.com/davinci
 	  For details please see http://www.ti.com/davinci
 
 
+config I2C_DESIGNWARE_CORE
+	tristate
+
 config I2C_DESIGNWARE_PLATFORM
 config I2C_DESIGNWARE_PLATFORM
 	tristate "Synopsys DesignWare Platform"
 	tristate "Synopsys DesignWare Platform"
 	depends on HAVE_CLK
 	depends on HAVE_CLK
+	select I2C_DESIGNWARE_CORE
 	help
 	help
 	  If you say yes to this option, support will be included for the
 	  If you say yes to this option, support will be included for the
 	  Synopsys DesignWare I2C adapter. Only master mode is supported.
 	  Synopsys DesignWare I2C adapter. Only master mode is supported.
@@ -368,6 +372,7 @@ config I2C_DESIGNWARE_PLATFORM
 config I2C_DESIGNWARE_PCI
 config I2C_DESIGNWARE_PCI
 	tristate "Synopsys DesignWare PCI"
 	tristate "Synopsys DesignWare PCI"
 	depends on PCI
 	depends on PCI
+	select I2C_DESIGNWARE_CORE
 	help
 	help
 	  If you say yes to this option, support will be included for the
 	  If you say yes to this option, support will be included for the
 	  Synopsys DesignWare I2C adapter. Only master mode is supported.
 	  Synopsys DesignWare I2C adapter. Only master mode is supported.

+ 3 - 2
drivers/i2c/busses/Makefile

@@ -33,10 +33,11 @@ obj-$(CONFIG_I2C_AU1550)	+= i2c-au1550.o
 obj-$(CONFIG_I2C_BLACKFIN_TWI)	+= i2c-bfin-twi.o
 obj-$(CONFIG_I2C_BLACKFIN_TWI)	+= i2c-bfin-twi.o
 obj-$(CONFIG_I2C_CPM)		+= i2c-cpm.o
 obj-$(CONFIG_I2C_CPM)		+= i2c-cpm.o
 obj-$(CONFIG_I2C_DAVINCI)	+= i2c-davinci.o
 obj-$(CONFIG_I2C_DAVINCI)	+= i2c-davinci.o
+obj-$(CONFIG_I2C_DESIGNWARE_CORE)	+= i2c-designware-core.o
 obj-$(CONFIG_I2C_DESIGNWARE_PLATFORM)	+= i2c-designware-platform.o
 obj-$(CONFIG_I2C_DESIGNWARE_PLATFORM)	+= i2c-designware-platform.o
-i2c-designware-platform-objs := i2c-designware-platdrv.o i2c-designware-core.o
+i2c-designware-platform-objs := i2c-designware-platdrv.o
 obj-$(CONFIG_I2C_DESIGNWARE_PCI)	+= i2c-designware-pci.o
 obj-$(CONFIG_I2C_DESIGNWARE_PCI)	+= i2c-designware-pci.o
-i2c-designware-pci-objs := i2c-designware-pcidrv.o i2c-designware-core.o
+i2c-designware-pci-objs := i2c-designware-pcidrv.o
 obj-$(CONFIG_I2C_EG20T)		+= i2c-eg20t.o
 obj-$(CONFIG_I2C_EG20T)		+= i2c-eg20t.o
 obj-$(CONFIG_I2C_GPIO)		+= i2c-gpio.o
 obj-$(CONFIG_I2C_GPIO)		+= i2c-gpio.o
 obj-$(CONFIG_I2C_HIGHLANDER)	+= i2c-highlander.o
 obj-$(CONFIG_I2C_HIGHLANDER)	+= i2c-highlander.o

+ 11 - 0
drivers/i2c/busses/i2c-designware-core.c

@@ -25,6 +25,7 @@
  * ----------------------------------------------------------------------------
  * ----------------------------------------------------------------------------
  *
  *
  */
  */
+#include <linux/export.h>
 #include <linux/clk.h>
 #include <linux/clk.h>
 #include <linux/errno.h>
 #include <linux/errno.h>
 #include <linux/err.h>
 #include <linux/err.h>
@@ -316,6 +317,7 @@ int i2c_dw_init(struct dw_i2c_dev *dev)
 	dw_writel(dev, dev->master_cfg , DW_IC_CON);
 	dw_writel(dev, dev->master_cfg , DW_IC_CON);
 	return 0;
 	return 0;
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_init);
 
 
 /*
 /*
  * Waiting for bus not busy
  * Waiting for bus not busy
@@ -568,12 +570,14 @@ done:
 
 
 	return ret;
 	return ret;
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_xfer);
 
 
 u32 i2c_dw_func(struct i2c_adapter *adap)
 u32 i2c_dw_func(struct i2c_adapter *adap)
 {
 {
 	struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
 	struct dw_i2c_dev *dev = i2c_get_adapdata(adap);
 	return dev->functionality;
 	return dev->functionality;
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_func);
 
 
 static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
 static u32 i2c_dw_read_clear_intrbits(struct dw_i2c_dev *dev)
 {
 {
@@ -678,17 +682,20 @@ tx_aborted:
 
 
 	return IRQ_HANDLED;
 	return IRQ_HANDLED;
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_isr);
 
 
 void i2c_dw_enable(struct dw_i2c_dev *dev)
 void i2c_dw_enable(struct dw_i2c_dev *dev)
 {
 {
        /* Enable the adapter */
        /* Enable the adapter */
 	dw_writel(dev, 1, DW_IC_ENABLE);
 	dw_writel(dev, 1, DW_IC_ENABLE);
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_enable);
 
 
 u32 i2c_dw_is_enabled(struct dw_i2c_dev *dev)
 u32 i2c_dw_is_enabled(struct dw_i2c_dev *dev)
 {
 {
 	return dw_readl(dev, DW_IC_ENABLE);
 	return dw_readl(dev, DW_IC_ENABLE);
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_is_enabled);
 
 
 void i2c_dw_disable(struct dw_i2c_dev *dev)
 void i2c_dw_disable(struct dw_i2c_dev *dev)
 {
 {
@@ -699,18 +706,22 @@ void i2c_dw_disable(struct dw_i2c_dev *dev)
 	dw_writel(dev, 0, DW_IC_INTR_MASK);
 	dw_writel(dev, 0, DW_IC_INTR_MASK);
 	dw_readl(dev, DW_IC_CLR_INTR);
 	dw_readl(dev, DW_IC_CLR_INTR);
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_disable);
 
 
 void i2c_dw_clear_int(struct dw_i2c_dev *dev)
 void i2c_dw_clear_int(struct dw_i2c_dev *dev)
 {
 {
 	dw_readl(dev, DW_IC_CLR_INTR);
 	dw_readl(dev, DW_IC_CLR_INTR);
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_clear_int);
 
 
 void i2c_dw_disable_int(struct dw_i2c_dev *dev)
 void i2c_dw_disable_int(struct dw_i2c_dev *dev)
 {
 {
 	dw_writel(dev, 0, DW_IC_INTR_MASK);
 	dw_writel(dev, 0, DW_IC_INTR_MASK);
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_disable_int);
 
 
 u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev)
 u32 i2c_dw_read_comp_param(struct dw_i2c_dev *dev)
 {
 {
 	return dw_readl(dev, DW_IC_COMP_PARAM_1);
 	return dw_readl(dev, DW_IC_COMP_PARAM_1);
 }
 }
+EXPORT_SYMBOL_GPL(i2c_dw_read_comp_param);