[linux-yocto] [PATCH 03/12] i2c: i2c-octeon: Add octeon_i2c_cvmx2i2c() function.

Chandrakala Chavva cchavva.cavm at gmail.com
Thu Jan 29 07:32:02 PST 2015


From: Abhishek Paliwal <abhishek.paliwal at aricent.com>

From: David Daney <david.daney at cavium.com>

... to allow interaction with cvmx-twsi code.

Signed-off-by: David Daney <david.daney at cavium.com>
Signed-off-by: Abhishek Paliwal <abhishek.paliwal at aricent.com>
---
 arch/mips/include/asm/octeon/octeon.h |  2 ++
 drivers/i2c/busses/i2c-octeon.c       | 28 ++++++++++++++++++++++++++++
 2 files changed, 30 insertions(+)

diff --git a/arch/mips/include/asm/octeon/octeon.h b/arch/mips/include/asm/octeon/octeon.h
index 58e8beb..dc42317 100644
--- a/arch/mips/include/asm/octeon/octeon.h
+++ b/arch/mips/include/asm/octeon/octeon.h
@@ -268,6 +268,8 @@ void octeon_irq_set_ip4_handler(octeon_irq_ip4_handler_t);
 
 extern void octeon_fixup_irqs(void);
 
+int octeon_i2c_cvmx2i2c(unsigned int cvmx_twsi_bus_num);
+
 int register_co_cache_error_notifier(struct notifier_block *nb);
 int unregister_co_cache_error_notifier(struct notifier_block *nb);
 #define CO_CACHE_ERROR_RECOVERABLE 0
diff --git a/drivers/i2c/busses/i2c-octeon.c b/drivers/i2c/busses/i2c-octeon.c
index 96d88d0..0cbfc8f 100644
--- a/drivers/i2c/busses/i2c-octeon.c
+++ b/drivers/i2c/busses/i2c-octeon.c
@@ -80,6 +80,7 @@ struct octeon_i2c {
 	struct device *dev;
 	int broken_irq_mode;
 	bool octeon_i2c_hlc_enabled;
+	int cvmx_channel;
 };
 
 /**
@@ -903,6 +904,17 @@ static int octeon_i2c_initlowlevel(struct octeon_i2c *i2c)
 	return 0;
 }
 
+static int octeon_i2c_cvmx_map[2] = {-ENODEV, -ENODEV};
+
+int octeon_i2c_cvmx2i2c(unsigned int cvmx_twsi_bus_num)
+{
+	if (cvmx_twsi_bus_num < ARRAY_SIZE(octeon_i2c_cvmx_map))
+		return octeon_i2c_cvmx_map[cvmx_twsi_bus_num];
+	else
+		return -ENODEV;
+}
+EXPORT_SYMBOL(octeon_i2c_cvmx2i2c);
+
 static int octeon_i2c_probe(struct platform_device *pdev)
 {
 	int irq, result = 0;
@@ -920,6 +932,7 @@ static int octeon_i2c_probe(struct platform_device *pdev)
 		result = -ENOMEM;
 		goto out;
 	}
+	i2c->cvmx_channel = -1;
 	i2c->dev = &pdev->dev;
 
 	res_mem = platform_get_resource(pdev, IORESOURCE_MEM, 0);
@@ -947,6 +960,17 @@ static int octeon_i2c_probe(struct platform_device *pdev)
 
 	i2c->sys_freq = octeon_get_io_clock_rate();
 
+	switch (res_mem->start) {
+	case 0x1180000001000:
+		i2c->cvmx_channel = 0;
+		break;
+	case 0x1180000001200:
+		i2c->cvmx_channel = 1;
+		break;
+	default:
+		break;
+	}
+
 	if (!devm_request_mem_region(&pdev->dev, res_mem->start, resource_size(res_mem),
 				     res_mem->name)) {
 		dev_err(i2c->dev, "request_mem_region failed\n");
@@ -990,6 +1014,8 @@ static int octeon_i2c_probe(struct platform_device *pdev)
 		goto out;
 	}
 	dev_info(i2c->dev, "version %s\n", DRV_VERSION);
+	if (i2c->cvmx_channel >= 0)
+		octeon_i2c_cvmx_map[i2c->cvmx_channel] = i2c->adap.nr;
 
 	return 0;
 
@@ -1001,6 +1027,8 @@ static int octeon_i2c_remove(struct platform_device *pdev)
 {
 	struct octeon_i2c *i2c = platform_get_drvdata(pdev);
 
+	if (i2c->cvmx_channel >= 0)
+		octeon_i2c_cvmx_map[i2c->cvmx_channel] = -ENODEV;
 	i2c_del_adapter(&i2c->adap);
 	return 0;
 };
-- 
1.8.1.4



More information about the linux-yocto mailing list