From 0c8d8684110cf6649e4030cc2ac3b955c64620d9 Mon Sep 17 00:00:00 2001 From: Tzafrir Cohen Date: Thu, 15 Mar 2012 17:35:57 +0000 Subject: xpp: reset Astribank SPI busses * A driver reload should reset Astribank hardware * This patch send an SPI reset after we get AB_DESCRIPTION reply from Astribank Signed-off-by: Oron Peled Acked-by: Tzafrir Cohen Origin: http://svnview.digium.com/svn/dahdi?view=rev&rev=10474 git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/branches/2.6@10489 a0bf4364-ded3-4de4-8d8a-66a801d63aff --- drivers/dahdi/xpp/card_global.c | 27 +++++++++++++++++++++++---- drivers/dahdi/xpp/card_global.h | 5 +++-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/drivers/dahdi/xpp/card_global.c b/drivers/dahdi/xpp/card_global.c index ff3b7e0..29c43f0 100644 --- a/drivers/dahdi/xpp/card_global.c +++ b/drivers/dahdi/xpp/card_global.c @@ -422,19 +422,37 @@ int xpp_register_request(xbus_t *xbus, xpd_t *xpd, xportno_t portno, return 0; } -/* 0x23 */ HOSTCMD(GLOBAL, RESET_SYNC_COUNTERS) +/* + * Wrapper for different types of xbus reset + */ +static int send_xbus_reset(xbus_t *xbus, uint8_t reset_mask) { xframe_t *xframe; xpacket_t *pack; BUG_ON(!xbus); - //XBUS_DBG(SYNC, xbus, "\n"); - XFRAME_NEW_CMD(xframe, pack, xbus, GLOBAL, RESET_SYNC_COUNTERS, 0); - RPACKET_FIELD(pack, GLOBAL, RESET_SYNC_COUNTERS, mask) = 0x10; + XFRAME_NEW_CMD(xframe, pack, xbus, GLOBAL, XBUS_RESET, 0); + RPACKET_FIELD(pack, GLOBAL, XBUS_RESET, mask) = reset_mask; send_cmd_frame(xbus, xframe); return 0; } +/* 0x23 */ HOSTCMD(GLOBAL, RESET_SPI) +{ + XBUS_DBG(DEVICES, xbus, "Sending SPI reset\n"); + /* toggle reset line */ + send_xbus_reset(xbus, 0x04); + send_xbus_reset(xbus, 0x00); + return 0; +} + + +/* 0x23 */ HOSTCMD(GLOBAL, RESET_SYNC_COUNTERS) +{ + //XBUS_DBG(SYNC, xbus, "\n"); + return send_xbus_reset(xbus, 0x10); +} + /*---------------- GLOBAL: Astribank Reply Handlers -----------------------*/ HANDLER_DEF(GLOBAL, NULL_REPLY) @@ -526,6 +544,7 @@ HANDLER_DEF(GLOBAL, AB_DESCRIPTION) /* 0x08 */ list_add_tail(&card_desc->card_list, &worker->card_list); spin_unlock_irqrestore(&worker->worker_lock, flags); } + CALL_PROTO(GLOBAL, RESET_SPI, xbus, NULL); if (!xbus_process_worker(xbus)) { ret = -ENODEV; goto out; diff --git a/drivers/dahdi/xpp/card_global.h b/drivers/dahdi/xpp/card_global.h index 6264e84..270027e 100644 --- a/drivers/dahdi/xpp/card_global.h +++ b/drivers/dahdi/xpp/card_global.h @@ -38,7 +38,7 @@ enum global_opcodes { XPROTO_NAME(GLOBAL, SYNC_REPLY) = 0x1A, /**/ XPROTO_NAME(GLOBAL, ERROR_CODE) = 0x22, - XPROTO_NAME(GLOBAL, RESET_SYNC_COUNTERS) = 0x23, + XPROTO_NAME(GLOBAL, XBUS_RESET) = 0x23, XPROTO_NAME(GLOBAL, NULL_REPLY) = 0xFE, }; @@ -87,7 +87,7 @@ DEF_RPACKET_DATA(GLOBAL, SYNC_REPLY, DEF_RPACKET_DATA(GLOBAL, REGISTER_REPLY, reg_cmd_t regcmd; ); -DEF_RPACKET_DATA(GLOBAL, RESET_SYNC_COUNTERS, +DEF_RPACKET_DATA(GLOBAL, XBUS_RESET, byte mask; ); DEF_RPACKET_DATA(GLOBAL, ERROR_CODE, @@ -98,6 +98,7 @@ DEF_RPACKET_DATA(GLOBAL, ERROR_CODE, /* 0x07 */ DECLARE_CMD(GLOBAL, AB_REQUEST); /* 0x19 */ DECLARE_CMD(GLOBAL, SYNC_SOURCE, enum sync_mode mode, int drift); +/* 0x23 */ DECLARE_CMD(GLOBAL, RESET_SPI); /* 0x23 */ DECLARE_CMD(GLOBAL, RESET_SYNC_COUNTERS); int xpp_register_request(xbus_t *xbus, xpd_t *xpd, xportno_t portno, -- cgit v1.2.3