From 398a66d2733077eec55fe55f6d090d1a08f863d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Jirman?= Date: Wed, 23 Oct 2019 05:08:35 +0200 Subject: [PATCH 035/391] gnss: ubx: Send soft powerdown message on suspend Signed-off-by: Ondrej Jirman --- drivers/gnss/ubx.c | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/drivers/gnss/ubx.c b/drivers/gnss/ubx.c index c951be202..6f09229da 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