Commit 16fd976c authored by Vaibhav Hiremath's avatar Vaibhav Hiremath Committed by Greg Kroah-Hartman

greybus: arche-platform: Do not assert wake/detect signal to SVC

With new definition of AP module boot flow (from HotPlug camp),
AP is not supposed to send any wake/detect signal to SVC, instead,
during boot SVC would straight away send wake_out pulse on wake/detect
line.
Note that, pin configuration of wake/detect line would be set to
active-high by default, so wake/detect line would always stay high,
unless SVC drives it. AP module uses wake/detect line strictly in input
mode.

Testing Done: Tested on EVT1.5 platform.

Note: We are yet to decide on PM support for APBx, so we may need to
generate/handshake with SVC over wake/detect line in the future. As of
now, follow the implementation and add stuff as and when they come.
Signed-off-by: default avatarVaibhav Hiremath <vaibhav.hiremath@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent e54b106d
...@@ -207,9 +207,6 @@ static int apb_poweroff(struct device *dev, void *data) ...@@ -207,9 +207,6 @@ static int apb_poweroff(struct device *dev, void *data)
static void assert_wakedetect(struct arche_platform_drvdata *arche_pdata) static void assert_wakedetect(struct arche_platform_drvdata *arche_pdata)
{ {
/* Assert wake/detect = Detect event from AP */
gpio_direction_output(arche_pdata->wake_detect_gpio, 1);
/* Enable interrupt here, to read event back from SVC */ /* Enable interrupt here, to read event back from SVC */
gpio_direction_input(arche_pdata->wake_detect_gpio); gpio_direction_input(arche_pdata->wake_detect_gpio);
enable_irq(arche_pdata->wake_detect_irq); enable_irq(arche_pdata->wake_detect_irq);
...@@ -371,9 +368,7 @@ static void arche_platform_poweroff_seq(struct arche_platform_drvdata *arche_pda ...@@ -371,9 +368,7 @@ static void arche_platform_poweroff_seq(struct arche_platform_drvdata *arche_pda
/* If in fw_flashing mode, then no need to repeate things again */ /* If in fw_flashing mode, then no need to repeate things again */
if (arche_pdata->state != ARCHE_PLATFORM_STATE_FW_FLASHING) { if (arche_pdata->state != ARCHE_PLATFORM_STATE_FW_FLASHING) {
disable_irq(arche_pdata->wake_detect_irq); disable_irq(arche_pdata->wake_detect_irq);
/* Send disconnect/detach event to SVC */
gpio_direction_output(arche_pdata->wake_detect_gpio, 0);
usleep_range(100, 200);
spin_lock_irqsave(&arche_pdata->wake_lock, flags); spin_lock_irqsave(&arche_pdata->wake_lock, flags);
arche_platform_set_wake_detect_state(arche_pdata, arche_platform_set_wake_detect_state(arche_pdata,
WD_STATE_IDLE); WD_STATE_IDLE);
...@@ -411,9 +406,9 @@ static ssize_t state_store(struct device *dev, ...@@ -411,9 +406,9 @@ static ssize_t state_store(struct device *dev,
if (arche_pdata->state == ARCHE_PLATFORM_STATE_ACTIVE) if (arche_pdata->state == ARCHE_PLATFORM_STATE_ACTIVE)
goto exit; goto exit;
assert_wakedetect(arche_pdata);
ret = arche_platform_coldboot_seq(arche_pdata); ret = arche_platform_coldboot_seq(arche_pdata);
assert_wakedetect(arche_pdata);
} else if (sysfs_streq(buf, "standby")) { } else if (sysfs_streq(buf, "standby")) {
if (arche_pdata->state == ARCHE_PLATFORM_STATE_STANDBY) if (arche_pdata->state == ARCHE_PLATFORM_STATE_STANDBY)
goto exit; goto exit;
...@@ -484,8 +479,8 @@ static int arche_platform_pm_notifier(struct notifier_block *notifier, ...@@ -484,8 +479,8 @@ static int arche_platform_pm_notifier(struct notifier_block *notifier,
arche_platform_poweroff_seq(arche_pdata); arche_platform_poweroff_seq(arche_pdata);
break; break;
case PM_POST_SUSPEND: case PM_POST_SUSPEND:
arche_platform_coldboot_seq(arche_pdata);
assert_wakedetect(arche_pdata); assert_wakedetect(arche_pdata);
arche_platform_coldboot_seq(arche_pdata);
break; break;
default: default:
break; break;
...@@ -588,8 +583,7 @@ static int arche_platform_probe(struct platform_device *pdev) ...@@ -588,8 +583,7 @@ static int arche_platform_probe(struct platform_device *pdev)
arche_pdata->wake_detect_gpio); arche_pdata->wake_detect_gpio);
return ret; return ret;
} }
/* deassert wake detect */
gpio_direction_output(arche_pdata->wake_detect_gpio, 0);
arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_IDLE); arche_platform_set_wake_detect_state(arche_pdata, WD_STATE_IDLE);
arche_pdata->dev = &pdev->dev; arche_pdata->dev = &pdev->dev;
...@@ -608,8 +602,8 @@ static int arche_platform_probe(struct platform_device *pdev) ...@@ -608,8 +602,8 @@ static int arche_platform_probe(struct platform_device *pdev)
dev_err(dev, "failed to request wake detect IRQ %d\n", ret); dev_err(dev, "failed to request wake detect IRQ %d\n", ret);
return ret; return ret;
} }
/* Enable it only after sending wake/detect event */
disable_irq(arche_pdata->wake_detect_irq); assert_wakedetect(arche_pdata);
ret = device_create_file(dev, &dev_attr_state); ret = device_create_file(dev, &dev_attr_state);
if (ret) { if (ret) {
...@@ -630,8 +624,6 @@ static int arche_platform_probe(struct platform_device *pdev) ...@@ -630,8 +624,6 @@ static int arche_platform_probe(struct platform_device *pdev)
goto err_populate; goto err_populate;
} }
assert_wakedetect(arche_pdata);
arche_pdata->pm_notifier.notifier_call = arche_platform_pm_notifier; arche_pdata->pm_notifier.notifier_call = arche_platform_pm_notifier;
ret = register_pm_notifier(&arche_pdata->pm_notifier); ret = register_pm_notifier(&arche_pdata->pm_notifier);
mutex_unlock(&arche_pdata->platform_state_mutex); mutex_unlock(&arche_pdata->platform_state_mutex);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment