On Sun, Aug 17, 2014 at 09:58:25AM +0800, Chris Zhong wrote: > +static void rk808_device_shutdown(void) > +{ > + int ret; > + struct rk808 *rk808 = g_rk808; > + > + if (!rk808) { > + dev_err(rk808->dev, "%s have no g_rk808\n", __func__); > + return; > + } This is a bit dodgy but I can't think of a better way of doing it :/ > + > + ret = regmap_update_bits(rk808->regmap, > + RK808_INT_STS_MSK_REG1, > + (0x3 << 5), (0x3 << 5)); > + /* close rtc int when power off */ > + ret = regmap_update_bits(rk808->regmap, > + RK808_RTC_INT_REG, > + (0x3 << 2), 0); > + /* close rtc int when power off */ > + ret = regmap_update_bits(rk808->regmap, > + RK808_DEVCTRL_REG, > + (0x1 << 3), (0x1 << 3)); > + if (ret < 0) > + dev_err(rk808->dev, "rk808 power off error!\n"); Defines for these bits would be good, though if this turns off the RTC alarm then it might be better not to do it - one thing people do with RTC alarms is use them to wake the system up from deep sleep. > + while (1) > + wfi(); > +} Just let the kernel shut down by itself - or is that last write a system power off request? > + ret = regmap_read(rk808->regmap, 0x2f, &val); > + if (ret < 0) { > + dev_err(rk808->dev, "The device is not rk808 %d\n", ret); > + return ret; > + } That error message is misleading - an error from regmap_read() means that I/O failed, usually "device is not rk808" would mean that you'd read back and ID register on the device and it didn't match what was expected.
Attachment:
signature.asc
Description: Digital signature