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

Signed-off-by: Steven Miao <[email protected]>
---
 drivers/staging/icc/core/protocol.c |   49 ++++++++++++----------------------
 drivers/staging/icc/include/icc.h   |    8 +++++
 2 files changed, 25 insertions(+), 32 deletions(-)

diff --git a/drivers/staging/icc/core/protocol.c b/drivers/staging/icc/core/protocol.c
index dea4a17..563b42e 100644
--- a/drivers/staging/icc/core/protocol.c
+++ b/drivers/staging/icc/core/protocol.c
@@ -24,6 +24,7 @@
 #include <asm/cacheflush.h>
 #include <asm/icc.h>
 #include <asm/dma.h>
+#include <asm/portmux.h>
 
 #define DRIVER_NAME "icc"
 
@@ -1243,38 +1244,24 @@ int icc_request_dev_name(const char *name, struct platform_device **saved_pdev)
 	return 0;
 }
 
-int res_manage_request_peri(uint16_t subid)
+int res_manage_request_peri(resources_t *data)
 {
-	int ret;
-	struct platform_device *pdev;
-	if (icc_peri_array[subid].pdev)
-		return -EBUSY;
+	unsigned short *peri_list = (unsigned short *)data->resources_array;
+	char resource_name[32] = "coreb-";
 
-	ret = icc_request_dev_name(icc_peri_array[subid].name, &pdev);
-	if (ret) {
-		/* not managed by linux, coreb can use it */
-		return 0;
-	}
+	strcat(resource_name, data->label);
 
-	if (pdev->dev.driver) {
-		/* already bound with driver */
-		return -EBUSY;
-	}
+	if (peripheral_request_list(peri_list, resource_name))
+		sm_debug("Requesting Peripherals %s failed\n", resource_name);
 
-	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)
+void res_manage_free_peri(resources_t *data)
 {
-	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;
+	unsigned short *peri_list = (unsigned short *)data->resources_array;
+
+	peripheral_free_list(peri_list);
 }
 
 int res_manage_request_gpio(uint16_t subid)
@@ -1312,7 +1299,7 @@ void res_manage_free_dma(uint16_t subid)
 	free_dma(subid);
 }
 
-int res_manage_request(uint16_t id)
+int res_manage_request(uint16_t id, resources_t *data)
 {
 	int ret = 0;
 	uint16_t type, subid;
@@ -1321,7 +1308,7 @@ int res_manage_request(uint16_t id)
 	sm_debug("%s %x %x\n", __func__, type, subid);
 	switch (type) {
 	case RESMGR_TYPE_PERIPHERAL:
-		ret = res_manage_request_peri(subid);
+		ret = res_manage_request_peri(data);
 		break;
 	case RESMGR_TYPE_GPIO:
 		ret = res_manage_request_gpio(subid);
@@ -1338,7 +1325,7 @@ int res_manage_request(uint16_t id)
 	return ret;
 }
 
-int res_manage_free(uint16_t id)
+int res_manage_free(uint16_t id, resources_t *data)
 {
 	int ret = 0;
 	uint16_t type, subid;
@@ -1346,7 +1333,7 @@ int res_manage_free(uint16_t id)
 	subid = RESMGR_SUBID(id);
 	switch (type) {
 	case RESMGR_TYPE_PERIPHERAL:
-		res_manage_free_peri(subid);
+		res_manage_free_peri(data);
 		break;
 	case RESMGR_TYPE_GPIO:
 		res_manage_free_gpio(subid);
@@ -1633,11 +1620,9 @@ static int sm_resouce_manage_recvmsg(struct sm_msg *msg, struct sm_session *sess
 	struct sm_icc_desc *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_RES_MGR_REQUEST:
-		sm_debug("%s free %x\n", __func__, (uint32_t)msg->payload);
-		ret = res_manage_request((uint16_t)msg->payload);
+		ret = res_manage_request((uint16_t)msg->payload, (resources_t *)msg->length);
 		if (ret)
 			sm_send_control_msg(session, msg->src_ep, icc_info->peer_cpu, 0,
 					0, SM_RES_MGR_REQUEST_FAIL);
@@ -1647,7 +1632,7 @@ static int sm_resouce_manage_recvmsg(struct sm_msg *msg, struct sm_session *sess
 
 		break;
 	case SM_RES_MGR_FREE:
-		res_manage_free((uint16_t)msg->payload);
+		res_manage_free((uint16_t)msg->payload, (resources_t *)msg->length);
 		sm_send_control_msg(session, msg->src_ep, icc_info->peer_cpu, 0,
 					0, SM_RES_MGR_FREE_DONE);
 		break;
diff --git a/drivers/staging/icc/include/icc.h b/drivers/staging/icc/include/icc.h
index 5cb9f62..1f9b2b4 100644
--- a/drivers/staging/icc/include/icc.h
+++ b/drivers/staging/icc/include/icc.h
@@ -57,6 +57,7 @@ enum {
 	RESMGR_TYPE_MAX,
 };
 
+
 #define EP_RESMGR_SERVICE 0
 
 #define RES_TYPE_OFFSET  12
@@ -289,6 +290,13 @@ struct sm_packet {
 	void *param;
 };
 
+typedef struct {
+	char label[32];				/* owner name */
+	uint16_t count;				/* resource number in next array */
+	uint32_t resources_array;		/* address of the resource ID array */
+} resources_t;
+
+
 #define SM_SCALAR_CMD(x) ((x) >> 16 & 0xffff)
 #define SM_SCALAR_CMDARG(x) ((x) & 0xffff)
 #define SM_SCALAR_CMD_HEAD 0xFE
_______________________________________________
Linux-kernel-commits mailing list
[email protected]
https://blackfin.uclinux.org/mailman/listinfo/linux-kernel-commits

Reply via email to