From 21307662463898619177f8290f24007d38d3810e 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: 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 92402f6082c4..fd0ccb054477 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

