65 lines
1.7 KiB
Diff
65 lines
1.7 KiB
Diff
|
From 24febdd07b59057676dba64529084523127a7a70 Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= <megi@xff.cz>
|
||
|
Date: Wed, 23 Oct 2019 05:08:35 +0200
|
||
|
Subject: [PATCH 041/389] gnss: ubx: Send soft powerdown message on suspend
|
||
|
|
||
|
Signed-off-by: Ondrej Jirman <megi@xff.cz>
|
||
|
---
|
||
|
drivers/gnss/ubx.c | 35 +++++++++++++++++++++++++++++++++++
|
||
|
1 file changed, 35 insertions(+)
|
||
|
|
||
|
diff --git a/drivers/gnss/ubx.c b/drivers/gnss/ubx.c
|
||
|
index c951be202ca2..6f09229da095 100644
|
||
|
--- a/drivers/gnss/ubx.c
|
||
|
+++ b/drivers/gnss/ubx.c
|
||
|
@@ -33,11 +33,46 @@ static int ubx_set_active(struct gnss_serial *gserial)
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
+// RXM-PMREQ
|
||
|
+static const u8 ubx_suspend_packet[] = {
|
||
|
+ 0xb5, 0x62, // 'ub'
|
||
|
+ 0x02, 0x41, // message class and id
|
||
|
+ 0x08, 0x00, // message length
|
||
|
+ 0x00, 0x00, 0x00, 0x00, // duration (0 == infinite)
|
||
|
+ 0x02, 0x00, 0x00, 0x00, // flags (backup)
|
||
|
+ 0x4d, 0x3b, // checksum
|
||
|
+};
|
||
|
+
|
||
|
static int ubx_set_standby(struct gnss_serial *gserial)
|
||
|
{
|
||
|
struct ubx_data *data = gnss_serial_get_drvdata(gserial);
|
||
|
int ret;
|
||
|
|
||
|
+#if 0
|
||
|
+ struct serdev_device *serdev = gserial->serdev;
|
||
|
+
|
||
|
+ // we can't know what state the device is in, so first make sure
|
||
|
+ // it's woken up by writing a zero byte to it and then suspend it
|
||
|
+ // for sure
|
||
|
+
|
||
|
+ ret = serdev_device_write(serdev, "", 1, MAX_SCHEDULE_TIMEOUT);
|
||
|
+ if (ret < 0)
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ serdev_device_wait_until_sent(serdev, 0);
|
||
|
+
|
||
|
+ // wait for wakeup
|
||
|
+ mdelay(100);
|
||
|
+
|
||
|
+ ret = serdev_device_write(serdev, ubx_suspend_packet,
|
||
|
+ sizeof(ubx_suspend_packet),
|
||
|
+ MAX_SCHEDULE_TIMEOUT);
|
||
|
+ if (ret < 0 || ret < sizeof(ubx_suspend_packet))
|
||
|
+ return ret;
|
||
|
+
|
||
|
+ serdev_device_wait_until_sent(serdev, 0);
|
||
|
+#endif
|
||
|
+
|
||
|
ret = regulator_disable(data->vcc);
|
||
|
if (ret)
|
||
|
return ret;
|
||
|
--
|
||
|
2.35.3
|
||
|
|