commit: http://blackfin.uclinux.org/git/?p=linux-kernel;a=commitdiff;h=0531c2a1529ec26f26ac0f2e270c256e81ae5ab0
branch: http://blackfin.uclinux.org/git/?p=linux-kernel;a=shortlog;h=refs/heads/trunk

add platform icc peripheral array
add peripheral reqeust and free implementation

Signed-off-by: Steven Miao <[email protected]>
---
 arch/blackfin/include/asm/icc.h     |    7 ++++
 arch/blackfin/mach-bf561/icc.c      |   11 +++++++
 arch/blackfin/mach-bf609/icc.c      |   37 ++++++++++++++++++++++
 drivers/staging/icc/core/protocol.c |   57 ++++++++++++++++++++++------------
 4 files changed, 92 insertions(+), 20 deletions(-)

diff --git a/arch/blackfin/include/asm/icc.h b/arch/blackfin/include/asm/icc.h
index 31cfef8..21e1b35 100644
--- a/arch/blackfin/include/asm/icc.h
+++ b/arch/blackfin/include/asm/icc.h
@@ -21,7 +21,14 @@ struct icc_platform_data {
 	struct icc_peer_platform_data *peer_info;
 };
 
+struct icc_peri_resource {
+	const char *name;
+	struct platform_device *pdev;
+	uint16_t resource_id;
+};
+
 void platform_send_ipi(cpumask_t callmap, int irq);
 void platform_send_ipi_cpu(unsigned int cpu, int irq);
 void platform_clear_ipi(unsigned int cpu, int irq);
+extern struct icc_peri_resource icc_peri_array[];
 #endif
diff --git a/arch/blackfin/mach-bf561/icc.c b/arch/blackfin/mach-bf561/icc.c
index 3f6ebfe..69ac4e7 100644
--- a/arch/blackfin/mach-bf561/icc.c
+++ b/arch/blackfin/mach-bf561/icc.c
@@ -2,6 +2,17 @@
 #include <linux/kernel.h>
 #include <linux/interrupt.h>
 #include <linux/delay.h>
+#include <asm/icc.h>
+
+struct icc_peri_resource icc_peri_array[] = {
+	{"bfin-spi.0", NULL, 0},
+	{"bfin-ppi.0", NULL, 0},
+	{"bfin-ppi.1", NULL, 0},
+	{"bfin-sport.0", NULL, 0},
+	{"bfin-sport.1", NULL, 0},
+	{"bfin-uart.0", NULL, 0},
+	{"bfin-timer.0", NULL, 0},
+};
 
 void platform_send_ipi(cpumask_t callmap, int irq)
 {
diff --git a/arch/blackfin/mach-bf609/icc.c b/arch/blackfin/mach-bf609/icc.c
index f6738cb..33e08cb 100644
--- a/arch/blackfin/mach-bf609/icc.c
+++ b/arch/blackfin/mach-bf609/icc.c
@@ -3,6 +3,43 @@
 #include <linux/interrupt.h>
 #include <linux/delay.h>
 #include <mach/pm.h>
+#include <asm/icc.h>
+
+struct icc_peri_resource icc_peri_array[] = {
+	{"cnt.0", NULL, 0},
+	{"bfin-sdh.0", NULL, 0},
+	{"bfin_can.0", NULL, 0},
+	{"bfin-linkport.0", NULL, 0},
+	{"bfin-linkport.1", NULL, 0},
+	{"bfin-linkport.2", NULL, 0},
+	{"bfin-linkport.3", NULL, 0},
+	{"bfin-timer.0", NULL, 0},
+	{"bfin-timer.1", NULL, 0},
+	{"bfin-timer.2", NULL, 0},
+	{"bfin-timer.3", NULL, 0},
+	{"bfin-timer.4", NULL, 0},
+	{"bfin-timer.5", NULL, 0},
+	{"bfin-timer.6", NULL, 0},
+	{"bfin-timer.7", NULL, 0},
+	{"bfin-crc.0", NULL, 0},
+	{"bfin-crc.1", NULL, 0},
+	{"i2c-bfin-twi.0", NULL, 0},
+	{"i2c-bfin-twi.1", NULL, 0},
+	{"bfin-uart.0", NULL, 0},
+	{"bfin-uart.1", NULL, 0},
+	{"physmap-flash.0", NULL, 0},
+	{"stmmaceth.0", NULL, 0},
+	{"stmmaceth.1", NULL, 0},
+	{"bfin-spi.0", NULL, 0},
+	{"bfin-spi.1", NULL, 0},
+	{"bfin-sport.0", NULL, 0},
+	{"bfin-sport.1", NULL, 0},
+	{"bfin-sport.2", NULL, 0},
+	{"bfin-ppi.0", NULL, 0},
+	{"bfin-ppi.1", NULL, 0},
+	{"bfin-dma.0", NULL, 0},
+	{"musb-blackfin.0", NULL, 0},
+};
 
 void platform_send_ipi_cpu(unsigned int cpu, int irq)
 {
diff --git a/drivers/staging/icc/core/protocol.c b/drivers/staging/icc/core/protocol.c
index b662758..dea4a17 100644
--- a/drivers/staging/icc/core/protocol.c
+++ b/drivers/staging/icc/core/protocol.c
@@ -1223,13 +1223,11 @@ unsigned int icc_poll(struct file *file, poll_table *wait)
 	return mask;
 }
 
-struct platform_device *saved_pdev;
-int icc_find_dev_name(char *name)
+int icc_request_dev_name(const char *name, struct platform_device **saved_pdev)
 {
 	struct device *d;
 	struct platform_device *pdev;
 
-	sm_debug("%s\n", name);
 	d = bus_find_device_by_name(&platform_bus_type, NULL, name);
 	if (d == NULL) {
 		sm_debug("no device found\n");
@@ -1238,8 +1236,8 @@ int icc_find_dev_name(char *name)
 
 		pdev = to_platform_device(d);
 
-		saved_pdev = pdev;
-		platform_device_unregister(pdev);
+		if (saved_pdev)
+			*saved_pdev = pdev;
 	}
 
 	return 0;
@@ -1247,12 +1245,36 @@ int icc_find_dev_name(char *name)
 
 int res_manage_request_peri(uint16_t subid)
 {
+	int ret;
+	struct platform_device *pdev;
+	if (icc_peri_array[subid].pdev)
+		return -EBUSY;
+
+	ret = icc_request_dev_name(icc_peri_array[subid].name, &pdev);
+	if (ret) {
+		/* not managed by linux, coreb can use it */
+		return 0;
+	}
+
+	if (pdev->dev.driver) {
+		/* already bound with driver */
+		return -EBUSY;
+	}
+
+	platform_device_unregister(pdev);
+	icc_peri_array[subid].resource_id = subid;
+	icc_peri_array[subid].pdev = pdev;
 	return 0;
 }
 
 void res_manage_free_peri(uint16_t subid)
 {
-
+	struct platform_device *pdev = icc_peri_array[subid].pdev;
+	if (!pdev)
+		return;
+	platform_device_add(pdev);
+	icc_peri_array[subid].resource_id = 0;
+	icc_peri_array[subid].pdev = NULL;
 }
 
 int res_manage_request_gpio(uint16_t subid)
@@ -1296,18 +1318,19 @@ int res_manage_request(uint16_t id)
 	uint16_t type, subid;
 	type = RESMGR_TYPE(id);
 	subid = RESMGR_SUBID(id);
+	sm_debug("%s %x %x\n", __func__, type, subid);
 	switch (type) {
 	case RESMGR_TYPE_PERIPHERAL:
-		res_manage_request_peri(subid);
+		ret = res_manage_request_peri(subid);
 		break;
 	case RESMGR_TYPE_GPIO:
-		res_manage_request_gpio(subid);
+		ret = res_manage_request_gpio(subid);
 		break;
 	case RESMGR_TYPE_SYS_IRQ:
-		res_manage_request_irq(subid);
+		ret = res_manage_request_irq(subid);
 		break;
 	case RESMGR_TYPE_DMA:
-		res_manage_request_dma(subid);
+		ret = res_manage_request_dma(subid);
 		break;
 	default:
 		ret = -ENODEV;
@@ -1581,6 +1604,9 @@ static int sm_task_sendmsg(struct sm_message *message, struct sm_session *sessio
 static int sm_task_recvmsg(struct sm_msg *msg, struct sm_session *session)
 {
 	struct sm_message *message;
+	struct sm_icc_desc *icc_info;
+	icc_info = get_icc_peer(msg);
+	BUG_ON(!icc_info);
 	sm_debug("%s msg type %x\n", __func__, (uint32_t)msg->type);
 	switch (msg->type) {
 	case SM_TASK_RUN_ACK:
@@ -1590,6 +1616,7 @@ static int sm_task_recvmsg(struct sm_msg *msg, struct sm_session *session)
 		list_del(&message->next);
 
 		kfree((void *)msg->payload);
+		wake_up(&icc_info->iccq_tx_wait);
 		break;
 	case SM_TASK_KILL_ACK:
 		break;
@@ -1832,16 +1859,6 @@ icc_write_proc(struct file *file, const char __user * buffer,
 
 	line[count - 1] = '\0';
 
-	if (!strcmp(line, "test")) {
-		icc_find_dev_name("bfin-spi.0");
-		return count;
-	}
-
-	if (!strcmp(line, "test1")) {
-		platform_device_add(saved_pdev);
-		return count;
-	}
-
 	if (strict_strtoul(line, 10, &val))
 		return -EINVAL;
 
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to