From c0b5979f4b0aec1a687960a786cc9408e861ffb9 Mon Sep 17 00:00:00 2001 From: James Wylder Date: Thu, 17 Mar 2011 14:28:54 -0500 Subject: [PATCH] misc: radio_ctrl: wrigley: add reset command Change-Id: Ib0f45c1e9bf584338427e4eb7b1f23334e5c4c8e Signed-off-by: James Wylder --- drivers/misc/radio_ctrl/wrigley_ctrl.c | 38 ++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/drivers/misc/radio_ctrl/wrigley_ctrl.c b/drivers/misc/radio_ctrl/wrigley_ctrl.c index b1e6a136617f..4e60a2bb04bc 100644 --- a/drivers/misc/radio_ctrl/wrigley_ctrl.c +++ b/drivers/misc/radio_ctrl/wrigley_ctrl.c @@ -101,6 +101,42 @@ static ssize_t wrigley_do_powerdown(struct wrigley_info *info) return err; } +/* hard reset of Wrigley data card + * recipe is: + * 1) set force_flash high + * 2) configure reset as output and drive low for 10ms + * 3) configure reset as input + * 4) set force flash low + * 5) verify data card reset by sampling reset + */ +static ssize_t wrigley_do_reset(struct wrigley_info *info) +{ + int i; + int value; + int err = -1; + + gpio_direction_output(info->flash_gpio, 1); + + gpio_direction_output(info->reset_gpio, 0); + msleep(10); + gpio_set_value(info->reset_gpio, 1); + + gpio_direction_input(info->reset_gpio); + gpio_set_value(info->flash_gpio, 0); + for (i = 0; i < 10; i++) { + value = gpio_get_value(info->reset_gpio); + pr_info("%s: reset value = %d\n", __func__, value); + if (!value) { + err = 0; + info->status = WRIGLEY_STATUS_OFF; + break; + } + msleep(100); + } + + return err; +} + static ssize_t wrigley_do_powerup(struct wrigley_info *info) { int i, value, err = -1; @@ -163,6 +199,8 @@ static ssize_t wrigley_command(struct radio_dev *rdev, char *cmd) if (strcmp(cmd, "shutdown") == 0) return wrigley_do_powerdown(info); + else if (strcmp(cmd, "reset") == 0) + return wrigley_do_reset(info); else if (strcmp(cmd, "powerup") == 0) return wrigley_do_powerup(info); else if (strcmp(cmd, "bootmode_normal") == 0) -- 2.34.1