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
