On Wed, Nov 20, 2013 at 02:36:49PM +0000, Bringmann, Michael Wolfe (Michael) wrote: > Hello, Paul: > You may be able to suppress/remove this entire subdirectory. There is > another > version of the driver that I have observed in the Yocto Linux builds in the > file, > > drivers/i2c/busses/i2c-axxia.c >
Michael, Have you tested both drivers? Is this duplication? Or is there a reason we have both? I'll be glad to remove duplication, but just wanted to make sure before I do. -paul > Michael > > -----Original Message----- > From: Paul Butler [mailto:butler.p...@gmail.com] > Sent: Tuesday, November 19, 2013 10:23 PM > To: linux-yocto@yoctoproject.org > Cc: bruce.ashfi...@windriver.com; butler.p...@gmail.com; Bringmann, Michael > Wolfe (Michael); Paul Butler > Subject: [PATCH 19/78] drivers/i2c: Collapse AI2C driver implementation - > removing ai2c_* > > From: Michael Bringmann <michael.bringm...@lsi.com> > > Signed-off-by: Michael Bringmann <michael.bringm...@lsi.com> > Signed-off-by: Paul Butler <paul.but...@windriver.com> > --- > drivers/i2c/busses/ai2c/ai2c_plat.c | 758 > ----------------------------------- > drivers/i2c/busses/ai2c/ai2c_plat.h | 336 ---------------- > drivers/i2c/busses/ai2c/ai2c_sal.c | 109 ----- > drivers/i2c/busses/ai2c/ai2c_sal.h | 393 ------------------ > drivers/i2c/busses/ai2c/ai2c_types.h | 118 ------ > 5 files changed, 1714 deletions(-) > delete mode 100644 drivers/i2c/busses/ai2c/ai2c_plat.c > delete mode 100644 drivers/i2c/busses/ai2c/ai2c_plat.h > delete mode 100644 drivers/i2c/busses/ai2c/ai2c_sal.c > delete mode 100644 drivers/i2c/busses/ai2c/ai2c_sal.h > delete mode 100644 drivers/i2c/busses/ai2c/ai2c_types.h > > diff --git a/drivers/i2c/busses/ai2c/ai2c_plat.c > b/drivers/i2c/busses/ai2c/ai2c_plat.c > deleted file mode 100644 > index 94f4445..0000000 > --- a/drivers/i2c/busses/ai2c/ai2c_plat.c > +++ /dev/null > @@ -1,758 +0,0 @@ > -/* > - * Copyright (C) 2013 LSI Corporation > - * > - * See file CREDITS for list of people who contributed to this > - * project. > - * > - * This program is free software; you can redistribute it and/or > - * modify it under the terms of the GNU General Public License as > - * published by the Free Software Foundation; either version 2 of > - * the License, or (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > - * MA 02111-1307 USA > - */ > - > -/*! @file ai2c_plat.c > - > - @brief Linux driver implementation of I2C using the ACP I2C > - features upon an LSI development board (San Antonio, > - Mission, El Paso, ...) > - > - @details Command line module parameters (with defaults) include, > - int ai2c_trace_level = (AI2C_MSG_INFO | AI2C_MSG_ERROR); > - int ai2c_chip_ver = -1; > - //Optional: Needed to figure out memory map, etc. > - //Can verify against value from 0xa.0x10.0x2c > - //Values; 0=X1_REL1 > - // 1=X1_REL2+ > - // 7=X7_REL1+ > - > - @details Several items contained in the 'i2c' section of the '.dts' > - are used to configure this module including the addresses of > - the memory partition, IRQ number, number of DMEs to use (when > - we want to override the inferences based on the chipType), etc. > -*/ > - > -/* > -#define EXTENDED_GSDBG_INFO > -#define AI2C_EXTERNAL_BUILD > - > -#define CONFIG_LSI_UBOOTENV > -#define CONFIG_I2C > -#define AI2C_CHIP_VER=<verNum> > -*/ > - > -#include "ai2c_bus.h" > -#include "regs/ai2c_cfg_node_reg_defines.h" > -#include "regs/ai2c_cfg_node_regs.h" > -#include "asm/lsi/acp_ncr.h" > - > -/***************************************************************************** > - * Local State > - > *****************************************************************************/ > -/* > - * This block of code defines the memory addresses for each h/w block > - * that is accessible as a direct bus i/o operation. > - * > - * IMPORTANT: ALL BUS GROUPINGS MUST BE MAINTAINED > - */ > -static struct ai2c_dev_page_s ai2c_dev_page[AI2C_DEV_PAGE_END_MARKER] = { > - { > - AI2C_DEV_PAGE_I2C_0, "AXXIA_I2C0", 0, 0x00000000000ULL, > - AI2C_DEV_SIZE_4KB, AI2C_DEV_ACCESS_LITTLE_ENDIAN, > - AI2C_PAGE_FLAGS_I2CBUS, NULL, > - }, > - { > - AI2C_DEV_PAGE_I2C_1, "AXXIA_I2C1", 0, 0x00000000000ULL, > - AI2C_DEV_SIZE_4KB, AI2C_DEV_ACCESS_LITTLE_ENDIAN, > - AI2C_PAGE_FLAGS_I2CBUS, NULL, > - }, > - { > - AI2C_DEV_PAGE_I2C_2, "AXXIA_I2C2", 0, 0x00000000000ULL, > - AI2C_DEV_SIZE_4KB, AI2C_DEV_ACCESS_LITTLE_ENDIAN, > - AI2C_PAGE_FLAGS_I2CBUS, NULL, > - }, > - { > - AI2C_DEV_PAGE_I2C_3, "AXXIA_SMB", 0, 0x00000000000ULL, > - AI2C_DEV_SIZE_4KB, AI2C_DEV_ACCESS_LITTLE_ENDIAN, > - AI2C_PAGE_FLAGS_I2CBUS, NULL, > - }, > - { > - AI2C_DEV_PAGE_END_MARKER, NULL, 0, 0x00000000000ULL, 0, 0, > - AI2C_PAGE_FLAGS_NONE, NULL, > - }, > - { > - AI2C_DEV_PAGE_END_MARKER, NULL, 0, 0x00000000000ULL, 0, 0, > - AI2C_PAGE_FLAGS_NONE, NULL, > - }, > - { > - AI2C_DEV_PAGE_END_MARKER, NULL, 0, 0x00000000000ULL, 0, 0, > - AI2C_PAGE_FLAGS_NONE, NULL, > - }, > - { > - AI2C_DEV_PAGE_END_MARKER, NULL, 0, 0x00000000000ULL, 0, 0, > - AI2C_PAGE_FLAGS_NONE, NULL, > - }, > -}; > - > -static struct ai2c_dev_chip_entry_s ai2c_chip_id[] = { > - { AI2C_CHIP_ACP55xx, "AXM55xx", 4, &ai2c_axm5500_cfg, }, > - { AI2C_CHIP_ACP35xx, "AXM35xx", 3, &ai2c_axm5500_cfg, }, > -}; > - > -static u32 ai2c_chip_id_count = sizeof(ai2c_chip_id)/ > - sizeof(struct ai2c_dev_chip_entry_s); > - > - /* Region Map > - * Note: Must be same number of entries (and in same order) as > - * the "AI2C_DEV_PAGE_xxx" enumeration. > - */ > - > -static struct ai2c_access_map ai2cDummyRegionMap[] = > AI2C_DUMMY_REGION_MAP_INIT; > - > -static struct ai2c_region_io ai2c_region_io_map[] = { > - /* 323.0 */ > - { > - AI2C_REGION_I2C_0, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_I2C_0, > - }, > - /* 332.0 */ > - { > - AI2C_REGION_I2C_1, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_I2C_1, > - }, > - /* 332.0 */ > - { > - AI2C_REGION_I2C_2, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_I2C_2, > - }, > - /* 348.0 */ > - { > - AI2C_REGION_I2C_3, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_I2C_3, > - }, > - /* 320.0 */ > - { > - AI2C_REGION_GPIO_0, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_GPIO_0, > - }, > - /* 398.0 */ > - { > - AI2C_REGION_RESET_CTRL, ai2cDummyRegionMap, > - __ai2c_dev_dcr_read, __ai2c_dev_dcr_write, > - AI2C_DEV_PAGE_RESET_CTRL, > - }, > - /* 326.0 */ > - { > - AI2C_REGION_TIMER, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_TIMER, > - }, > - /* 329.0 */ > - { > - AI2C_REGION_GPREG, ai2cDummyRegionMap, > - __ai2c_dev_direct_read, __ai2c_dev_direct_write, > - AI2C_DEV_PAGE_GPREG, > - }, > -}; > - > -static const u32 ai2c_region_pages_max = > - sizeof(ai2c_region_io_map) / sizeof(struct ai2c_region_io); > - > - > -/***************************************************************************** > - * Miscellaneous Utility functions > - > *****************************************************************************/ > - > -u32 ai2c_page_to_region( > - struct ai2c_priv *priv, > - u32 pageId) > -{ > - int i; > - for (i = 0; i < ai2c_region_pages_max; i++) > - if (pageId == ai2c_region_io_map[i].pageId) > - return ai2c_region_io_map[i].regionId; > - return AI2C_REGION_NULL; > -} > - > -struct ai2c_region_io *ai2c_region_lookup( > - struct ai2c_priv *priv, > - u32 regionId) > -{ > - int i; > - for (i = 0; i < ai2c_region_pages_max; i++) > - if (regionId == ai2c_region_io_map[i].regionId) > - return &ai2c_region_io_map[i]; > - return NULL; > -} > - > -/***************************************************************************** > - * Read/Write ACP Memory Spaces > - > *****************************************************************************/ > - > -/* > - * ai2c_dev_direct_read > - * > - * Perform 32-bit AI2C device I/O to non-ConfigRing region. > - */ > -int ai2c_dev_direct_read( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth) > -{ > - int st = 0; > - u32 endianness; > - unsigned long busAddr; > - u32 i; > - > - AI2C_MSG(AI2C_MSG_ENTRY, > - "direct_read enter: %x.%x.%llx %d\n", > - AI2C_NODE_ID(region->regionId), > - AI2C_TARGET_ID(region->regionId), > - (unsigned long long) offset, count); > - > - if (priv->pageAddr[region->pageId] == 0) { > - st = -EBADSLT; > - goto cleanup; > - } > - > - busAddr = AI2C_DEV_BUS_ADDR(priv, region->pageId, offset); > - endianness = AI2C_DEV_PAGE_ENDIANNESS(region->pageId); > - > - switch (xferWidth) { > - case 4: > - for (i = 0; i < count; i++, busAddr += 4, offset += 4) { > - buffer[i] = AI2C_BUS_READ32(busAddr, endianness); > - AI2C_MSG(AI2C_MSG_IOR, > - "direct_read: region=%x offset = %llx " > - "busAddr=%lx v=%x\n", > - region->regionId, offset, busAddr, buffer[i]); > - } > - break; > - case 2: > - { > - u16 *p16 = (u16 *) buffer; > - for (i = 0; i < count; i++, busAddr += 2) > - p16[i] = AI2C_BUS_READ16(busAddr, endianness); > - } > - break; > - case 1: > - { > - u8 *p8 = (u8 *) buffer; > - for (i = 0; i < count; i++, busAddr += 1) > - p8[i] = AI2C_BUS_READ8(busAddr); > - } > - break; > - default: > - st = -EACCES; > - break; > - } > - > -cleanup: > - AI2C_MSG(AI2C_MSG_EXIT, > - "direct_read exit: st=%d %x.%x.%llx=0x%08x\n", > - st, AI2C_NODE_ID(region->regionId), > - AI2C_TARGET_ID(region->regionId), (unsigned long long) offset, > - buffer[0]); > - return (int) st; > -} > - > -/* > - * ai2c_dev_direct_write > - * > - * Perform 32-bit AI2C device I/O to non-ConfigRing region. > - */ > -int ai2c_dev_direct_write( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth) > -{ > - int st = 0; > - u32 endianness; > - unsigned long busAddr; > - u32 i; > - > - AI2C_MSG(AI2C_MSG_ENTRY, > - "direct_write enter: %x.%x.%llx 0x%08x (%d)\n", > - AI2C_NODE_ID(region->regionId), > - AI2C_TARGET_ID(region->regionId), > - (unsigned long long) offset, > - buffer[0], count); > - > - if (priv->pageAddr[region->pageId] == 0) { > - st = -EBADSLT; > - goto cleanup; > - } > - > - busAddr = AI2C_DEV_BUS_ADDR(priv, region->pageId, offset); > - endianness = AI2C_DEV_PAGE_ENDIANNESS(region->pageId); > - > - switch (xferWidth) { > - case 4: > - for (i = 0; i < count; i++, busAddr += 4, offset += 4) { > - AI2C_BUS_WRITE32(busAddr, buffer[i], endianness); > - AI2C_MSG(AI2C_MSG_IOW, > - "direct_write: region=%x offset=%llx " > - "busAddr=%lx v=%x\n", > - region->regionId, offset, busAddr, buffer[i]); > - } > - break; > - > - case 2: > - { > - u16 *buf16 = (u16 *) buffer; > - for (i = 0; i < count; i++, busAddr += 2) { > - AI2C_BUS_WRITE16(busAddr, buf16[i], endianness); > - AI2C_MSG(AI2C_MSG_IOW, > - "direct_write: region=%x offset=%llx " > - "busAddr=%lx v=%x\n", > - region->regionId, > - offset, busAddr, buf16[i]); > - } > - } > - break; > - case 1: > - { > - u8 *buf8 = (u8 *) buffer; > - for (i = 0; i < count; i++, busAddr++) { > - AI2C_BUS_WRITE8(busAddr, buf8[i]); > - AI2C_MSG(AI2C_MSG_IOW, > - "direct_write: region=%x offset=%llx " > - "busAddr=%lx v=%x\n", > - region->regionId, > - offset, busAddr, buf8[i]); > - } > - } > - break; > - default: > - st = -EACCES; > - break; > - } > - > -cleanup: > - AI2C_MSG(AI2C_MSG_EXIT, "direct_write exit st=%d\n", st); > - return (int) st; > -} > - > -/* > - * ai2c_dev_read32 > - * > - */ > -int ai2c_dev_read32( > - struct ai2c_priv *priv, > - u32 regionId, > - u64 offset, > - u32 *buffer) > -{ > - int ai2cStatus = 0; > - struct ai2c_region_io *region = ai2c_region_lookup(priv, regionId); > - unsigned long lflags = 0; > - > - AI2C_SPINLOCK_INTERRUPT_DISABLE(&priv->regLock, lflags); > - > - AI2C_MSG(AI2C_MSG_ENTRY, > - "dev_read32 enter: %x.%x.%llx %d\n", > - AI2C_NODE_ID(regionId), AI2C_TARGET_ID(regionId), > - (unsigned long long) offset, 1); > - > - if (region) { > - ai2cStatus = > - AI2C_EDEV_BUS_BLOCK_READ32(priv, > - region->pageId, offset, 1, buffer); > - > - } else { > - > -#ifdef CONFIG_LSI_UBOOTENV > - ai2cStatus = ncr_read(regionId, (u32) offset, > - 1 * sizeof(u32), buffer); > -#else > - ai2cStatus = -ENOSYS; > -#endif > - } > - > - AI2C_SPINLOCK_INTERRUPT_ENABLE(&priv->regLock, lflags); > - > - return ai2cStatus; > -} > - > -/* > - * ai2c_dev_write32 > - * > - */ > -int ai2c_dev_write32( > - struct ai2c_priv *priv, > - u32 regionId, > - u64 offset, > - u32 buffer) > -{ > - int ai2cStatus = 0; > - struct ai2c_region_io *region = ai2c_region_lookup(priv, regionId); > - unsigned long lflags = 0; > - > - AI2C_SPINLOCK_INTERRUPT_DISABLE(&priv->regLock, lflags); > - > - AI2C_MSG(AI2C_MSG_ENTRY, > - "dev_write32 enter: %x.%x.%llx 0x%08x (%d)\n", > - AI2C_NODE_ID(regionId), AI2C_TARGET_ID(regionId), > - (unsigned long long) offset, (unsigned int)&buffer, 1); > - > - if (region) { > - ai2cStatus = > - AI2C_EDEV_BUS_BLOCK_WRITE32(priv, > - region->pageId, offset, 1, > - &buffer); > - > - } else { > - > -#ifdef CONFIG_LSI_UBOOTENV > - ai2cStatus = ncr_write(regionId, (u32) offset, > - 1 * sizeof(u32), &buffer); > -#else > - ai2cStatus = -ENOSYS; > -#endif > - } > - > - AI2C_SPINLOCK_INTERRUPT_ENABLE(&priv->regLock, lflags); > - > - return ai2cStatus; > -} > - > -/* > - * ai2c_dev_dcr_read > - * > - * Perform 32-bit AI2C device I/O to non-Config Ring region. > - */ > -int ai2c_dev_dcr_read( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth) > -{ > - return -ENOSYS; > -} > - > -/* > - * ai2c_dev_dcr_write > - * > - * Perform 32-bit AI2C device I/O from non-Config Ring region. > - */ > -int ai2c_dev_dcr_write( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth) > -{ > - return -ENOSYS; > -} > - > - > -/***************************************************************************** > - * Basic configuration Fill-in > - > *****************************************************************************/ > - > -static int ai2c_getChipType(struct ai2c_priv *priv) -{ > - int ai2cStatus = AI2C_ST_SUCCESS; > - u32 i; > -#ifdef CONFIG_LSI_UBOOTENV > - ai2c_bool_t has_ECID = TRUE; > - u32 rev_reg; > - u32 pt_reg; > - ai2c_cfg_node_node_cfg_r_t node_cfg; > - ai2c_cfg_node_node_info_0_r_t node_info; > - > - /* > - * Determine device revision > - */ > - > - /* Read the NCA local config node to see if we are an ASIC or FPGA */ > - AI2C_CALL(ai2c_dev_read32(priv, AI2C_REGION_NCA_CFG, > - AI2C_CFG_NODE_NODE_CFG, > - (u32 *) &node_cfg)); > - AI2C_CALL(ai2c_dev_read32(priv, AI2C_REGION_NCA_CFG, > - AI2C_CFG_NODE_NODE_INFO_0, > - (u32 *) &node_info)); > - > - if (node_cfg.fpga) { > - priv->hw_rev.isFpga = 1; > - /* v1 FPGA doesn't have the ECID block */ > - if (node_info.module_revision == 0) > - has_ECID = FALSE; > - > - } else > - priv->hw_rev.isAsic = 1; > - > - if (node_info.module_revision == AI2C_CHIP_ACP25xx || > - node_info.module_revision == AI2C_CHIP_ACP55xx) > - has_ECID = FALSE; > - > - /* Get the device chipType/Version from the ECID fuse block */ > - if (has_ECID) { > - > - AI2C_CALL(ai2c_dev_read32(priv, > - AI2C_REGION_ID(AI2C_NODE_X1_ECID, 0x10), > - 0x2c, (u32 *) &rev_reg)); > - > - AI2C_CALL(ai2c_dev_read32(priv, > - AI2C_REGION_ID(AI2C_NODE_X1_ECID, 0x10), > - 0x20, &pt_reg)); > - > - priv->hw_rev.chipType = (rev_reg & 0x0000001f); > - priv->hw_rev.chipVersion = (rev_reg & 0x000007e0) >> 5; > - priv->hw_rev.cpuDisable = (rev_reg & 0x00007800) >> 11; > - priv->hw_rev.sppDisable = (rev_reg & 0x00008000) >> 15; > - > - priv->hw_rev.packageType = (pt_reg & 0xf0000000) >> 28; > - } else { > - /* if we don't have an ECID just use the NCA module version */ > - priv->hw_rev.chipType = node_info.module_revision; > - priv->hw_rev.chipVersion = 0; > - priv->hw_rev.packageType = 0; > - priv->hw_rev.cpuDisable = 0; > - priv->hw_rev.sppDisable = 0; > - } > - > - /* fixup chipType for ACP344x variants */ > - switch (priv->hw_rev.chipType) { > - case 3: > - case 4: > - priv->hw_rev.chipType = AI2C_CHIP_ACP34xx; > - break; > - case 5: > - priv->hw_rev.chipType = AI2C_CHIP_ACP34xx; > - break; > - default: > - break; > - } > -#endif > - > - /* Environment variable override */ > - if (ai2c_chip_ver != -1) { > - priv->hw_rev.chipType = ai2c_chip_ver; > - priv->hw_rev.chipVersion = 0; > - } > -#ifdef AI2C_CHIP_VER > - else { > - priv->hw_rev.chipType = AI2C_CHIP_VER; > - priv->hw_rev.chipVersion = 0; > - } > -#endif > - > - for (i = 0; i < ai2c_chip_id_count; i++) { > - if (ai2c_chip_id[i].chipType == priv->hw_rev.chipType) { > - priv->busCfg = &ai2c_chip_id[i]; > - priv->numActiveBusses = ai2c_chip_id[i].numActiveBusses; > - } > - } > - if (priv->busCfg == NULL) { > - ai2cStatus = -ENXIO; > - goto ai2c_return; > - } > - > - AI2C_LOG(AI2C_MSG_INFO, "%s %d.%d.%d %s\n", > - priv->busCfg->chipName, > - priv->hw_rev.chipType, priv->hw_rev.chipVersion, > - priv->hw_rev.packageType, > - (priv->hw_rev.isFpga) ? "FPGA" : "ASIC"); > - > -ai2c_return: > - return ai2cStatus; > -} > - > -int ai2c_stateSetup(struct ai2c_priv **outPriv) -{ > - int ai2cStatus = AI2C_ST_SUCCESS; > - struct ai2c_priv *priv = NULL; > - > - /* Now for the private memory for this module. */ > - priv = ai2c_malloc(sizeof(struct ai2c_priv)); > - if (!priv) { > - AI2C_LOG(AI2C_MSG_ERROR, > - "Could not allocate AI2C private memory root!\n"); > - ai2cStatus = -ENOMEM; > - goto ai2c_return; > - } > - memset(priv, 0, sizeof(struct ai2c_priv)); > - > - /* Check chipType/chipVersion fields of 0xa.0x10.0x2c, first */ > - ai2cStatus = ai2c_getChipType(priv); > - if (ai2cStatus != AI2C_ST_SUCCESS) > - goto ai2c_return; > - > -ai2c_return: > - if (ai2cStatus != AI2C_ST_SUCCESS) > - (*outPriv) = NULL; > - else > - (*outPriv) = priv; > - > - return ai2cStatus; > -} > - > -int ai2c_memSetup( > - struct platform_device *pdev, > - struct ai2c_priv *priv) > -{ > - int ai2cStatus = AI2C_ST_SUCCESS; > - struct axxia_i2c_bus_platform_data *pdata; > - u32 busNdx; > - int i; > - > - /* Where is the current I2C device found on this platform? */ > - pdata = (struct axxia_i2c_bus_platform_data *) pdev->dev.platform_data; > - if (pdata == NULL) { > - AI2C_LOG(AI2C_MSG_ERROR, > - "Can't find platform-specific data!\n"); > - ai2cStatus = -ENXIO; > - goto ai2c_return; > - } > - busNdx = pdata->index; > - > - priv->pages = ai2c_dev_page; > - > - if (busNdx > (priv->numActiveBusses-1)) { > - AI2C_LOG(AI2C_MSG_ERROR, "Invalid I2C bus index (%d)\n", > - busNdx); > - ai2cStatus = -ENXIO; > - goto ai2c_return; > - } > - > - priv->pages[busNdx].busName = &pdata->name[0]; > - priv->pages[busNdx].bus_nr = pdata->bus_nr; > - priv->pages[busNdx].busAddr = pdata->dev_space.start; > - priv->pages[busNdx].size = > - pdata->dev_space.end - pdata->dev_space.start + 1; > - priv->pages[busNdx].pdata = pdata; > - > - AI2C_LOG(AI2C_MSG_DEBUG, > - "[%d] ba=0x%010llx (%llx, %llx) sz=0x%x\n", > - busNdx, > - priv->pages[busNdx].busAddr, > - pdata->dev_space.start, pdata->dev_space.end, > - priv->pages[busNdx].size); > - > - /* > - * Interrupt for this bus is in priv->pdata[i].int_space.start > - */ > - > - > - /* > - * Program Address Map driver tables > - */ > - if (priv->pageAddr == NULL) { > - priv->pageAddr = > - ai2c_malloc(AI2C_DEV_PAGE_END_MARKER * sizeof(u32)); > - if (priv->pageAddr == NULL) { > - AI2C_LOG(AI2C_MSG_ERROR, > - "Could not allocate AI2C pageAddr memory!\n"); > - ai2cStatus = -ENOMEM; > - goto ai2c_return; > - } > - memset(priv->pageAddr, 0, > - AI2C_DEV_PAGE_END_MARKER * sizeof(u32)); > - } > - > - for (i = 0; i < AI2C_DEV_PAGE_END_MARKER; i++) { > - > - if (priv->pageAddr[i] || > - (priv->pages[i].busAddr == 0) || > - (priv->pages[i].size == 0) || > - (priv->pages[i].pageId == AI2C_DEV_PAGE_END_MARKER)) > - continue; > - > - priv->pageAddr[i] = > - (u32) ioremap(priv->pages[i].busAddr, > - priv->pages[i].size); > - if (priv->pageAddr[i] == 0) { > - AI2C_LOG(AI2C_MSG_ERROR, > - "Could not ioremap AI2C pageAddr memory %d!\n", > - i); > - AI2C_LOG(AI2C_MSG_DEBUG, > - "ba=0x%010llx sz=0x%x\n", > - priv->pages[i].busAddr, > - priv->pages[i].size); > - ai2cStatus = -ENOMEM; > - goto ai2c_return; > - } else { > - AI2C_LOG(AI2C_MSG_DEBUG, > - "Map page %d (%08x) / %llx for %x => %x\n", > - priv->pages[i].pageId, > - ai2c_page_to_region(priv, > - priv->pages[i].pageId), > - (unsigned long long) priv->pages[i].busAddr, > - priv->pages[i].size, > - priv->pageAddr[i]); > - } > - } > - > - AI2C_SPINLOCK_INIT(&priv->regLock); > - AI2C_SPINLOCK_INIT(&priv->ioLock); > - > -ai2c_return: > - > - if (ai2cStatus != AI2C_ST_SUCCESS) { > - if (priv) { > - if (priv->pageAddr) { > - for (i = 0; i < AI2C_DEV_PAGE_END_MARKER; i++) > - if (priv->pageAddr[i] != 0) > - iounmap( > - (void __iomem *) > - priv->pageAddr[i]); > - ai2c_free(priv->pageAddr); > - } > - ai2c_free(priv); > - } > - } > - > - return ai2cStatus; > -} > - > -int ai2c_memDestroy(struct ai2c_priv *inPriv) -{ > - int ai2cStatus = AI2C_ST_SUCCESS; > - int i; > - > - if (inPriv) { > - if (inPriv->pageAddr) { > - for (i = 0; i < AI2C_DEV_PAGE_END_MARKER; i++) > - if (inPriv->pageAddr[i] != 0) > - iounmap((void *)inPriv->pageAddr[i]); > - > - ai2c_free(inPriv->pageAddr); > - } > - > - ai2c_free(inPriv); > - } > - > - return ai2cStatus; > -} > diff --git a/drivers/i2c/busses/ai2c/ai2c_plat.h > b/drivers/i2c/busses/ai2c/ai2c_plat.h > deleted file mode 100644 > index 54e6c5b..0000000 > --- a/drivers/i2c/busses/ai2c/ai2c_plat.h > +++ /dev/null > @@ -1,336 +0,0 @@ > -/* > - * Copyright (C) 2013 LSI Corporation > - * > - * See file CREDITS for list of people who contributed to this > - * project. > - * > - * This program is free software; you can redistribute it and/or > - * modify it under the terms of the GNU General Public License as > - * published by the Free Software Foundation; either version 2 of > - * the License, or (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > - * MA 02111-1307 USA > - */ > - > -#ifndef _AI2C_LINUX_H_ > -#define _AI2C_LINUX_H_ > - > -#include <linux/i2c.h> > -#include <linux/io.h> > -#include <linux/platform_device.h> > -#include <linux/i2c-axxia.h> > - > -#include "ai2c_sal.h" > -#include "ai2c_dev.h" > - > -/************************************************************************** > -* Constants * > -**************************************************************************/ > - > -/********************************************************************** > -* ACP I/O Mapped Functions Stuff * > -**********************************************************************/ > - > -#define __ai2c_dev_direct_read ai2c_dev_direct_read > -#define __ai2c_dev_direct_write ai2c_dev_direct_write > -#define __ai2c_dev_indirect_read ai2c_dev_indirect_read > -#define __ai2c_dev_indirect_write ai2c_dev_indirect_write > -#define __ai2c_dev_dcr_read ai2c_dev_dcr_read > -#define __ai2c_dev_dcr_write ai2c_dev_dcr_write > - > -/* > - * Enumeration of pages/regions tracked by this driver. > - */ > -enum { > - AI2C_DEV_PAGE_AHB_BEGIN, /* Placeholder (0/1) */ > - AI2C_DEV_PAGE_I2C_0 = AI2C_DEV_PAGE_AHB_BEGIN, > - AI2C_DEV_PAGE_I2C_1, > - AI2C_DEV_PAGE_I2C_2, > - AI2C_DEV_PAGE_I2C_3 /* aka SMB */, > - AI2C_DEV_PAGE_GPIO_0, > - AI2C_DEV_PAGE_RESET_CTRL, > - AI2C_DEV_PAGE_TIMER, > - AI2C_DEV_PAGE_GPREG, > - AI2C_DEV_PAGE_AHB_END = AI2C_DEV_PAGE_GPREG, > - > - AI2C_DEV_PAGE_END_MARKER, > -}; > - > -#undef AI2C_DEV_APB_PAGE_BASE > -#define AI2C_DEV_APB_PAGE_BASE AI2C_DEV_PAGE_AHB_BEGIN > - > - > -/************************************************************************** > -* Macros * > -**************************************************************************/ > - > - > /************************************************************************* > - * I/O Macros > - > *************************************************************************/ > - > -#define AI2C_EDEV_BUS_READ32(dev, p, o, var) \ > - ai2c_region_io_map[p].readFn(dev, &ai2c_region_io_map[p], \ > - o, (var), 1, 0, AI2C_NCA_CMD_CRBR, 4) > - > -#define AI2C_EDEV_BUS_BLOCK_READ32(dev, p, o, cnt, var) \ > - ai2c_region_io_map[p].readFn(dev, &ai2c_region_io_map[p], \ > - o, (var), cnt, 0, AI2C_NCA_CMD_CRBR, 4) > - > -#define AI2C_EDEV_BUS_WRITE32(dev, p, o, var) \ > - ai2c_region_io_map[p].writeFn(dev, &ai2c_region_io_map[p], \ > - o, (var), 1, 0, AI2C_NCA_CMD_CRBW, 4) > - > -#define AI2C_EDEV_BUS_BLOCK_WRITE32(dev, p, o, cnt, var) \ > - ai2c_region_io_map[p].writeFn(dev, &ai2c_region_io_map[p], \ > - o, (var), cnt, 0, AI2C_NCA_CMD_CRBW, 4) > - > - > /************************************************************************* > - * Debug Macros > - > *************************************************************************/ > - > -#define DBGINFO(args...) > - /* General debugging */ > -#define XDBGINFO(args...) > - /* Miscellaneous debugging, commented out */ > -#define ADBGINFO(args...) > - /* Address debugging */ > -#define D1DBGINFO(args...) > - /* Track descriptor chain register modifications */ > -#define D2DBGINFO(args...) > - /* Track descriptor chain tracking modifications */ > -#define D3DBGINFO(args...) > - /* Track descriptor chain reset modifications */ > -#define D4DBGINFO(args...) > - /* Track dme+descriptor chain modifications */ > -#define ODBGINFO(args...) > - /* Track tx irq transaction */ > -#define O2DBGINFO(args...) > - /* Track tx foreground transaction */ > -#define O3DBGINFO(args...) > - /* Track numFree changes for tx transaction */ > -#define IDBGINFO(args...) > - /* Track rx irq transaction */ > -#define I2DBGINFO(args...) > - /* Track rx foreground transaction */ > -#define I3DBGINFO(args...) > - /* Track numFree changes for rx transaction */ > -#define SDBGINFO(args...) > - /* Track dme select/release */ > -#define DDBGINFO(args...) > - /* Track dbell irq transaction */ > -#define EIDBGINFO(args...) > - /* Track enable/disable irqs */ > -#define GSDBGINFO(args...) printk(args) > - /* Dump lots of data to console during get_glob_stat */ > -#undef MDBG_SUPPORT > -#ifdef MDBG_SUPPORT > - #define MDBGINFO(args...) printk(args) > - /* Track maintenance accesses */ > -#else > - #define MDBGINFO(args...) > -#endif > - > - /********************************************************************** > - * Macros for Paged Sysmem Access Methods * > - **********************************************************************/ > - > -#define AI2C_EDEV_BUS_PAGE_SHIFT 18 > -#define AI2C_EDEV_BUS_PAGE_SIZE ((u64) 1 << AI2C_EDEV_BUS_PAGE_SHIFT) > - > -#define AI2C_EDEV_BUS_PAGE_MASK (AI2C_EDEV_BUS_PAGE_SIZE - 1) /* ??? */ > -#define AI2C_EDEV_BUS_PAGE_OFFSET(x) \ > - ((u32) (((x) & (~AI2C_EDEV_BUS_PAGE_MASK)) >> \ > - AI2C_EDEV_BUS_PAGE_SHIFT)) /* ??? */ > - > - > -/********************************************************************** > -* Low-level I/O based upon 'page' * > -**********************************************************************/ > - > -#define AI2C_DEV_BUS_ADDR(dev, pageId, offset) \ > - ((dev)->pageAddr[pageId] + offset) > - > -#define AI2C_DEV_PAGE_ENDIANNESS(pageId) (priv->pages[pageId].endianness) > - > - > -/************************************************************************** > -* Type Definitions * > -**************************************************************************/ > - > - /********************************************************************** > - * Support Memory Mappings for Driver State Structure * > - **********************************************************************/ > - > -#define AI2C_PAGE_FLAGS_NONE (0x00000000) > -#define AI2C_PAGE_FLAGS_I2CBUS (0x00000001) > - > -struct ai2c_dev_page_s { > - int pageId; > - char *busName; > - u32 bus_nr; > - u64 busAddr; /* 38-bit PCI address */ > - u32 size; > - u32 endianness; > - u32 flags; > - struct axxia_i2c_bus_platform_data *pdata; > -}; > - > -struct ai2c_dev_chip_entry_s { > - u32 chipType; > - char *chipName; > - u32 numActiveBusses; > - struct ai2c_i2c_access *api; > -}; > - > - > - /********************************************************************** > - * Driver State Structure * > - **********************************************************************/ > - > -struct ai2c_priv { > - spinlock_t regLock; > - spinlock_t ioLock; > - > - struct ai2c_rev_id hw_rev; > - > - /* Static configuration describing selected ACP I2C bus region */ > - struct ai2c_dev_chip_entry_s *busCfg; > - > - /* Memory Mapping/Management constructs */ > - u32 numActiveBusses; > - struct ai2c_dev_page_s *pages; > - /* Per module memory pages */ > - > - /* Memory indexing support to reach selected ACP regions */ > - u32 *pageAddr; > - > - /* Diagnostics */ > -}; > - > -/************************************************************************** > -* Exportable State * > -**************************************************************************/ > - > -extern int AI2C_MSG_TRACE_LEVEL; > - > -extern int ai2c_chip_ver; > - > - > -/************************************************************************** > -* Exportable Functions * > -**************************************************************************/ > - > -extern int ai2c_dev_read32( > - struct ai2c_priv *dev, > - u32 regionId, > - u64 offset, > - u32 *buffer); > - > -extern int ai2c_dev_write32( > - struct ai2c_priv *dev, > - u32 regionId, > - u64 offset, > - u32 buffer); > - > -int ai2c_dev_direct_read( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth); > - > -int ai2c_dev_direct_write( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth); > - > -int ai2c_dev_dcr_read( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth); > - > -int ai2c_dev_dcr_write( > - struct ai2c_priv *priv, > - struct ai2c_region_io *region, > - u64 offset, > - u32 *buffer, > - u32 count, > - u32 flags, > - u32 cmdType, > - u32 xferWidth); > - > -/***************************************************************************** > -* Externally Visible Function Prototypes * > -*****************************************************************************/ > - > -/*! @fn u32 ai2c_page_to_region(struct ai2c_priv *priv, > - * u32 pageId); > - * @brief Map a memory page handle to a regionId handle. > - @param[in] inPriv Created device state structure > - @param[in] inPageId Original page id to be mapped > - @Returns mapped value > - */ > -extern u32 ai2c_page_to_region(struct ai2c_priv *priv, u32 pageId); > - > -/*! @fn u32 *ai2c_region_lookup(struct ai2c_priv *priv, > - * u32 regionId); > - * @brief Map a memory region handle to a region description structure. > - @param[in] inPriv Created device state structure > - @param[in] inRegionId Original region id to be mapped > - @Returns mapped value > - */ > -extern struct ai2c_region_io *ai2c_region_lookup( > - struct ai2c_priv *priv, > - u32 regionId); > - > -/*! @fn int ai2c_stateSetup(struct ai2c_priv **outPriv); > - @brief This is a one time initialization for the state linking all > - of the I2C protocol layers to be called by the device > - initialization step. > - @param[out] outPriv Created device state structure > - @Returns success/failure status of the operation > -*/ > -extern int ai2c_stateSetup(struct ai2c_priv **outPriv); > - > -/*! @fn int ai2c_memSetup(struct platform_device *pdev, > - struct ai2c_priv *priv); > - @brief This is a per-device to-be-mapped setup for the I2C protocol > - layers to be called by the device initialization step. > - @param[in] inPDev Source platform device data strucure > - @param[in] inPriv Created device state structure > - @Returns success/failure status of the operation > -*/ > -extern int ai2c_memSetup(struct platform_device *pdev, > - struct ai2c_priv *priv); > - > -/*! @fn int ai2c_memDestroy(struct ai2c_priv *inPriv); > - @brief This function will release resources acquired for the specified > - I2C device driver. > - @param[in] inPriv Created device state structure > - @Returns success/failure status of the operation > -*/ > -extern int ai2c_memDestroy(struct ai2c_priv *inPriv); > - > - > -#endif /* _AI2C_PLAT_H_ */ > diff --git a/drivers/i2c/busses/ai2c/ai2c_sal.c > b/drivers/i2c/busses/ai2c/ai2c_sal.c > deleted file mode 100644 > index ceda0fa..0000000 > --- a/drivers/i2c/busses/ai2c/ai2c_sal.c > +++ /dev/null > @@ -1,109 +0,0 @@ > -/* > - * Copyright (C) 2013 LSI Corporation > - * > - * See file CREDITS for list of people who contributed to this > - * project. > - * > - * This program is free software; you can redistribute it and/or > - * modify it under the terms of the GNU General Public License as > - * published by the Free Software Foundation; either version 2 of > - * the License, or (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > - * MA 02111-1307 USA > - */ > - > -#include "ai2c_sal.h" > - > -/* > - * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * > - */ > - > -/* > - * definitions of the ai2c_malloc/ai2c_nvm_malloc family of functions. > - */ > - > -void *ai2c_malloc(size_t size) > -{ > - void *p; > - > - if (size <= 0) { > -#ifdef AI2C_DEBUG > - AI2C_MSG(AI2C_MSG_DEBUG, > - "WARNING: ai2c_malloc(%d) passed a zero or " > - "less size.\n", > - size); > -#endif > - return 0; > - } > - > - p = __ai2c_malloc(size); > - if (p == NULL) > - AI2C_MSG(AI2C_MSG_ERROR, "ai2c_malloc(%d) failed.\n", size); > - > - return p; > -} > - > -void *ai2c_calloc(size_t no, size_t size) -{ > - void *p; > - > - if (size <= 0 || no <= 0) { > -#ifdef AI2C_DEBUG > - AI2C_MSG(AI2C_MSG_DEBUG, > - "WARNING: ai2c_calloc(no=%d, size=%d) " > - "passed a zero or less size.\n", > - no, size); > -#endif > - return 0; > - } > - > - p = __ai2c_calloc(no, size); > - if (p == NULL) { > - AI2C_MSG(AI2C_MSG_ERROR, > - "ai2c_calloc(no=%d, size=%d) failed.\n", no, size); > - } > - return p; > -} > - > -void *ai2c_realloc(void *ptr, size_t size) -{ > - if (size <= 0) { > -#ifdef AI2C_DEBUG > - AI2C_MSG(AI2C_MSG_DEBUG, > - "WARNING: ai2c_realloc(%d) passed a zero or " > - "less size.\n", > - size); > -#endif > - return 0; > - } > - > - ptr = __ai2c_realloc(ptr, size); > - if (ptr == NULL) { > - AI2C_MSG(AI2C_MSG_ERROR, > - "ai2c_realloc(ptr=%p, size=%d) failed.\n", > - ptr, size); > - } > - return ptr; > -} > - > -void ai2c_free(void *ptr) > -{ > - if (ptr == NULL) { > -#ifdef AI2C_DEBUG > - AI2C_MSG(AI2C_MSG_DEBUG, > - "WARNING: ai2c_free(%p) passed a NULL pointer.\n", > - ptr); > -#endif > - return; > - } > - > - __ai2c_free(ptr); > -} > diff --git a/drivers/i2c/busses/ai2c/ai2c_sal.h > b/drivers/i2c/busses/ai2c/ai2c_sal.h > deleted file mode 100644 > index bbfd2f9..0000000 > --- a/drivers/i2c/busses/ai2c/ai2c_sal.h > +++ /dev/null > @@ -1,393 +0,0 @@ > -/* > - * Copyright (C) 2013 LSI Corporation > - * > - * See file CREDITS for list of people who contributed to this > - * project. > - * > - * This program is free software; you can redistribute it and/or > - * modify it under the terms of the GNU General Public License as > - * published by the Free Software Foundation; either version 2 of > - * the License, or (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > - * MA 02111-1307 USA > - */ > - > -/*! @file ai2c_sal.h > - @brief OS Specific definitions are located here. > -*/ > - > -#ifndef __AI2C_SAL_H__ > -#define __AI2C_SAL_H__ > - > -#include <generated/autoconf.h> > - > -#ifdef __KERNEL__ > - > -#include <linux/module.h> > -#include <linux/moduleparam.h> > -#include <linux/cdev.h> > -#include <linux/of_platform.h> > -#include <linux/init.h> > -#include <linux/poll.h> > -#include <linux/kthread.h> > -#include <linux/sched.h> > - > -#include <linux/io.h> > -#include <linux/ioport.h> > -#include <linux/kernel.h> > -#include <linux/wait.h> > -#include <asm/pgtable.h> > - > -#include <linux/slab.h> > -#include <linux/interrupt.h> > -#include <linux/irq.h> > -#include <linux/irqdomain.h> > -#include <linux/spinlock.h> > -#include <linux/signal.h> > - > -#include <linux/i2c.h> > -#include <linux/i2c-dev.h> > - > -#include <linux/version.h> > - > -#include <linux/time.h> > -#include <linux/fcntl.h> > -#include <linux/unistd.h> > -#include <linux/errno.h> > -#include <linux/mman.h> > - > -#include <asm/byteorder.h> > - > -#else > - > -#include <stdio.h> > -#include <stdlib.h> > - > -#endif > - > -#include "ai2c_types.h" > -#include "ai2c_dev.h" > - > - > -/************************************************************************** > -* Some Constants > -**************************************************************************/ > - > -#ifdef __BIG_ENDIAN > -#undef AI2C_BIG_ENDIAN > -#define AI2C_BIG_ENDIAN 9999 > -#undef AI2C_LITTLE_ENDIAN > -#endif > - > -#ifdef __LITTLE_ENDIAN > -#undef AI2C_BIG_ENDIAN > -#undef AI2C_LITTLE_ENDIAN > -#define AI2C_LITTLE_ENDIAN 9998 > -#endif > - > -/************************************************************************** > -* Macros > -**************************************************************************/ > - > -/* > -* AI2C_MSG > -* > -* Print a message to the system console. > -*/ > -#ifdef __KERNEL__ > - > -#define AI2C_MSG(type, fmt, args...) \ > - do { \ > - if ((type) & AI2C_MSG_TRACE_LEVEL) { \ > - if ((type) == AI2C_MSG_ERROR) \ > - printk(KERN_ERR AI2C_MOD_NAME ": ERROR: "); \ > - else \ > - printk(KERN_WARNING AI2C_MOD_NAME ": "); \ > - printk(fmt, ## args); \ > - } \ > - } while (0) > - > -#else > - > -#define AI2C_MSG(type, fmt, args...) \ > - do { \ > - if ((type) & AI2C_MSG_TRACE_LEVEL) { \ > - if ((type) == AI2C_MSG_ERROR) \ > - printf("[Error] " AI2C_MOD_NAME ": ERROR: "); \ > - else \ > - printf("[Warning] " AI2C_MOD_NAME ": "); \ > - printf(fmt, ## args); \ > - } \ > - } while (0) > - > -#endif > - > - /* > - * AI2C_LOG > - * > - * Print a message to the system log device and/or console. This > - * interface is callable from interrupt level. > - */ > -#define AI2C_LOG \ > - AI2C_MSG > - > -#ifndef AI2C_MSG_TRACE_LEVEL > -#define AI2C_MSG_TRACE_LEVEL ai2c_trace_level > -#endif > - > -extern int AI2C_MSG_TRACE_LEVEL; > - > - > -/* > -* Endian-ness Conversion > -*/ > - > -#define AI2C_SWAP16m(n) \ > - ((((u16)(n) >> 8) & 0x00ff) | \ > - (((u16)(n) << 8) & 0xff00)) > - > -#define AI2C_SWAP32m(n) \ > - ((((u32)(n) >> 24) & 0x000000ff) | \ > - (((u32)(n) >> 8) & 0x0000ff00) | \ > - (((u32)(n) << 8) & 0x00ff0000) | \ > - (((u32)(n) << 24) & 0xff000000)) > - > -#define SWAP16(x) \ > - { { \ > - u16 val = x; \ > - AI2C_SWAP16m(val); \ > - } } > - > -#define SWAP32(x) \ > - { { \ > - u32 val = x; \ > - AI2C_SWAP32m(val); \ > - } } > - > - > -/* > -* Endian-ness I/O > -*/ > - > -#ifdef CONFIG_ARM > - > -#define in_be8(x) (*x) > -#define in_be16(x) AI2C_SWAP16m(*x) > -#define in_be32(x) AI2C_SWAP32m(*x) > - > -#define in_le8(x) (*x) > -#define in_le16(x) (*x) > -#define in_le32(x) (*x) > - > -#define out_be8(a, v) (*a) = (v) > -#define out_be16(a, v) (*a) = AI2C_SWAP16m(v) > -#define out_be32(a, v) (*a) = AI2C_SWAP32m(v) > - > -#define out_le8(a, v) (*a) = (v) > -#define out_le16(a, v) (*a) = (v) > -#define out_le32(a, v) (*a) = (v) > - > -#endif /* CONFIG_ARM */ > - > - > -#define AI2C_EDEV_BUS_ENFORCE_ORDERING() > - > -#define AI2C_BUS_READ8(addr) \ > - readb((u8 *) (addr)) > - > -#define AI2C_BUS_READ16_ENDIAN(endian, addr) \ > - in_##endian##16((u16 __iomem *) (addr)) > - > - > -#define AI2C_BUS_READ16_LE(addr) AI2C_BUS_READ16_ENDIAN(le, addr) > - > -#define AI2C_BUS_READ16_BE(addr) AI2C_BUS_READ16_ENDIAN(be, addr) > - > -#define AI2C_BUS_READ16(addr, endian) \ > - (endian == AI2C_DEV_ACCESS_BIG_ENDIAN) ? \ > - AI2C_BUS_READ16_BE(addr) : AI2C_BUS_READ16_LE(addr) > - > -#define AI2C_BUS_READ32_ENDIAN(endian, addr) \ > - in_##endian##32((u32 __iomem *) (addr)) > - > - > -#define AI2C_BUS_READ32_LE(addr) AI2C_BUS_READ32_ENDIAN(le, addr) > - > -#define AI2C_BUS_READ32_BE(addr) AI2C_BUS_READ32_ENDIAN(be, addr) > - > -#define AI2C_BUS_READ32(addr, endian) \ > - (endian == AI2C_DEV_ACCESS_BIG_ENDIAN) ? \ > - AI2C_BUS_READ32_BE(addr) : AI2C_BUS_READ32_LE(addr) > - > - > -#define AI2C_BUS_WRITE8(addr, data) \ > - writeb((data), (u8 *) (addr)) > - > -#define AI2C_BUS_WRITE16_ENDIAN(endian, addr, data) \ > - do { \ > - u16 *__a__ = (u16 *) addr; \ > - u16 __d__ = data; \ > - out_##endian##16((u16 __iomem *) __a__, __d__); \ > - AI2C_EDEV_BUS_ENFORCE_ORDERING(); \ > - } while (0); > - > -#define AI2C_BUS_WRITE16_LE(addr, data) \ > - AI2C_BUS_WRITE16_ENDIAN(le, addr, data) > - > -#define AI2C_BUS_WRITE16_BE(addr, data) \ > - AI2C_BUS_WRITE16_ENDIAN(be, addr, data) > - > -#define AI2C_BUS_WRITE16(addr, data, endian) \ > - do { \ > - if (endian == AI2C_DEV_ACCESS_BIG_ENDIAN) { \ > - AI2C_BUS_WRITE16_BE(addr, data); \ > - } else { \ > - AI2C_BUS_WRITE16_LE(addr, data); \ > - } \ > - } while (0); > - > -#define AI2C_BUS_WRITE32_ENDIAN(endian, addr, data) \ > - do { \ > - u32 *__a__ = (u32 *) addr; \ > - u32 __d__ = data; \ > - out_##endian##32((u32 __iomem *) __a__, __d__); \ > - AI2C_EDEV_BUS_ENFORCE_ORDERING(); \ > - } while (0); > - > -#define AI2C_BUS_WRITE32_LE(addr, data) \ > - AI2C_BUS_WRITE32_ENDIAN(le, addr, data) > - > -#define AI2C_BUS_WRITE32_BE(addr, data) \ > - AI2C_BUS_WRITE32_ENDIAN(be, addr, data) > - > -#define AI2C_BUS_WRITE32(addr, data, endian) \ > - do { \ > - if (endian == AI2C_DEV_ACCESS_BIG_ENDIAN) { \ > - AI2C_BUS_WRITE32_BE(addr, data); \ > - } else { \ > - AI2C_BUS_WRITE32_LE(addr, data); \ > - } \ > - } while (0); > - > - /* > - * Spinlock mutex stuff > - */ > - > -#define AI2C_SPINLOCK_INIT(pSpinlock) \ > - spin_lock_init(pSpinlock) > - > -#define AI2C_SPINLOCK_LOCK(pSpinlock) \ > - spin_lock(pSpinlock) > - > -#define AI2C_SPINLOCK_TRYLOCK(pSpinlock) \ > - spin_trylock(pSpinlock) > - > -#define AI2C_SPINLOCK_UNLOCK(pSpinlock) \ > - spin_unlock(pSpinlock) > - > -#define AI2C_SPINLOCK_INTERRUPT_DISABLE(pSem, flags) \ > - spin_lock_irqsave(pSem, flags) > - > -#define AI2C_SPINLOCK_INTERRUPT_ENABLE(pSem, flags) \ > - spin_unlock_irqrestore(pSem, flags) > - > -#define AI2C_SPINLOCK_SW_INTERRUPT_DISABLE(pSem, flags) \ > - spin_lock_bh(pSem) > - > -#define AI2C_SPINLOCK_SW_INTERRUPT_ENABLE(pSem, flags) \ > - spin_unlock_bh(pSem) > - > - > -#ifdef __KERNEL__ > - /* > - * Kernel memory allocation > - */ > - > -#define __ai2c_malloc(size) kmalloc(size, GFP_KERNEL) > -#define __ai2c_free(ptr) kfree(ptr) > -#define __ai2c_realloc(ptr, size) (NULL) > -#define __ai2c_calloc(no, size) kcalloc(no, size, GFP_KERNEL) > - > -#else > - > - /* > - * User space memory allocation > - */ > - > -#define __ai2c_malloc(size) malloc(size) > -#define __ai2c_free(ptr) free(ptr) > -#define __ai2c_realloc(ptr, size) (NULL) > -#define __ai2c_calloc(no, size) calloc(no, size) > - > -#endif > - > - > - /* > - * Miscellaneous externs not provided by other headers reliably > - */ > - > -extern int snprintf(char *s, size_t n, const char *format, ...); > - > -struct ai2c_rev_id { > - > -#ifdef NCP_BIG_ENDIAN > - unsigned isAsic:1; > - unsigned isFpga:1; > - unsigned isSim:1; > - unsigned:2; > - unsigned secDisable:1; > - unsigned sppDisable:1; > - unsigned cpuDisable:4; > - unsigned ecidChipType:5; > - unsigned:1; > - unsigned packageType:4; > - unsigned chipVersion:6; > - unsigned chipTyp:5; > -#else > - unsigned chipType:5; > - unsigned chipVersion:6; > - unsigned packageType:4; > - unsigned:1; > - unsigned ecidChipType:5; > - unsigned cpuDisable:4; > - unsigned sppDisable:1; > - unsigned secDisable:1; > - unsigned:2; > - unsigned isSim:1; > - unsigned isFpga:1; > - unsigned isAsic:1; > -#endif > -}; > - > - > -/************************************************************************** > -* More Macros > -**************************************************************************/ > - > -/* Should this be in sal? */ > -#ifndef MIN > -#define MIN(a, b) ((a) < (b) ? (a) : (b)) > -#endif > - > -#ifndef MAX > -#define MAX(a, b) ((a) > (b) ? (a) : (b)) > -#endif > - > -/************************************************************************** > -* Function Prototypes > -**************************************************************************/ > - > -extern void *ai2c_malloc(size_t size); > -extern void *ai2c_realloc(void *ptr, size_t size); -extern void > *ai2c_calloc(size_t no, size_t size); -extern void ai2c_free(void *ptr); > - > -#endif /* __AI2C_SAL_H__ */ > diff --git a/drivers/i2c/busses/ai2c/ai2c_types.h > b/drivers/i2c/busses/ai2c/ai2c_types.h > deleted file mode 100644 > index a0c04da..0000000 > --- a/drivers/i2c/busses/ai2c/ai2c_types.h > +++ /dev/null > @@ -1,118 +0,0 @@ > -/* > - * Copyright (C) 2013 LSI Corporation > - * > - * See file CREDITS for list of people who contributed to this > - * project. > - * > - * This program is free software; you can redistribute it and/or > - * modify it under the terms of the GNU General Public License as > - * published by the Free Software Foundation; either version 2 of > - * the License, or (at your option) any later version. > - * > - * This program is distributed in the hope that it will be useful, > - * but WITHOUT ANY WARRANTY; without even the implied warranty of > - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the > - * GNU General Public License for more details. > - * > - * You should have received a copy of the GNU General Public License > - * along with this program; if not, write to the Free Software > - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, > - * MA 02111-1307 USA > - */ > - > -#ifndef AI2C_TYPES_H > -#define AI2C_TYPES_H > - > -#ifdef __KERNEL__ > - > -#include <linux/types.h> > - > -#else > - > -#define u64 unsigned long long > -#define u32 unsigned long > -#define s32 signed long > -#define size_t int > - > -#define AI2C_U32 unsigned long > - > -#define ai2c_uint8_t unsigned char > -#define ai2c_uint16_t unsigned short > -#define ai2c_uint32_t unsigned long > -#define ai2c_uint64_t unsigned long long > -#define ai2c_int8_t signed char > -#define ai2c_int16_t signed short > -#define ai2c_int32_t signed long > -#define ai2c_int64_t signed long long > -#define ai2c_bool_t unsigned short > -#define ai2c_size_t signed long > - > -#endif > - > -/************************************************************************** > -* Constants, #Defines, etc. > -**************************************************************************/ > - > -#ifndef NULL > -#define NULL 0 > -#endif > - > -#ifndef TRUE > -#define TRUE 1 > -#endif > - > -#ifndef FALSE > -#define FALSE 0 > -#endif > - > -/************************************************************************** > - * ACP chip types > - * > - * These are the base silicon chip types. Each chip may have one > - * or more variants, but for the purpose of the chipType comparison > - * we only care about the base silicon version. For any variant the > - * driver will set the chipType in virtual register 0x301.0.0 to > - * one of the following. > - **************************************************************************/ > - > -#define AI2C_CHIP_ACP34xx 1 > -#define AI2C_CHIP_ACP32xx 2 > -#define AI2C_CHIP_ACP25xx 6 > -#define AI2C_CHIP_ACP25xx_V2 7 > - > -#define AI2C_CHIP_X3X7_HYBRID 7 /* TEMP HACK */ > - > -#define AI2C_CHIP_ACP55xx 9 /* AXM55xx, aka X7 */ > -#define AI2C_CHIP_ACP35xx 16 /* AXM35xx, aka X3 */ > - > - > -/************************************************************************** > -* API Configuration Status Codes, Typedefs, etc. > -**************************************************************************/ > - > -#define AI2C_ST_SUCCESS (0) > - > - > -/************************************************************************** > -* Function Call Support Typedefs, Constants, Macros, etc. > -**************************************************************************/ > - > -#ifdef AI2C_ERR_DEBUG > -#define AI2C_PRINT_LINE_FILE \ > - AI2C_MSG(AI2C_MSG_INFO, "%s : %s, line = %d\n", \ > - ai2c_status_get(ai2cStatus), __FILE__, __LINE__) > -#else > -#define AI2C_PRINT_LINE_FILE > -#endif /* AI2C_ERR_DEBUG */ > - > -#define AI2C_CALL(ai2cFunc) \ > - do { \ > - ai2cStatus = (ai2cFunc); \ > - if (ai2cStatus != AI2C_ST_SUCCESS) { \ > - AI2C_PRINT_LINE_FILE; \ > - goto ai2c_return; \ > - } \ > - } while (0); > - > - > -#endif /* AI2C_TYPES_H */ > -- > 1.8.4.3 > > _______________________________________________ linux-yocto mailing list linux-yocto@yoctoproject.org https://lists.yoctoproject.org/listinfo/linux-yocto