ziirave_wdt.c 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * Copyright (C) 2015 Zodiac Inflight Innovations
  4. *
  5. * Author: Martyn Welch <[email protected]>
  6. *
  7. * Based on twl4030_wdt.c by Timo Kokkonen <timo.t.kokkonen at nokia.com>:
  8. *
  9. * Copyright (C) Nokia Corporation
  10. */
  11. #include <linux/delay.h>
  12. #include <linux/i2c.h>
  13. #include <linux/ihex.h>
  14. #include <linux/firmware.h>
  15. #include <linux/kernel.h>
  16. #include <linux/module.h>
  17. #include <linux/slab.h>
  18. #include <linux/sysfs.h>
  19. #include <linux/types.h>
  20. #include <linux/watchdog.h>
  21. #include <asm/unaligned.h>
  22. #define ZIIRAVE_TIMEOUT_MIN 3
  23. #define ZIIRAVE_TIMEOUT_MAX 255
  24. #define ZIIRAVE_TIMEOUT_DEFAULT 30
  25. #define ZIIRAVE_PING_VALUE 0x0
  26. #define ZIIRAVE_STATE_INITIAL 0x0
  27. #define ZIIRAVE_STATE_OFF 0x1
  28. #define ZIIRAVE_STATE_ON 0x2
  29. #define ZIIRAVE_FW_NAME "ziirave_wdt.fw"
  30. static char *ziirave_reasons[] = {"power cycle", "hw watchdog", NULL, NULL,
  31. "host request", NULL, "illegal configuration",
  32. "illegal instruction", "illegal trap",
  33. "unknown"};
  34. #define ZIIRAVE_WDT_FIRM_VER_MAJOR 0x1
  35. #define ZIIRAVE_WDT_BOOT_VER_MAJOR 0x3
  36. #define ZIIRAVE_WDT_RESET_REASON 0x5
  37. #define ZIIRAVE_WDT_STATE 0x6
  38. #define ZIIRAVE_WDT_TIMEOUT 0x7
  39. #define ZIIRAVE_WDT_TIME_LEFT 0x8
  40. #define ZIIRAVE_WDT_PING 0x9
  41. #define ZIIRAVE_WDT_RESET_DURATION 0xa
  42. #define ZIIRAVE_FIRM_PKT_TOTAL_SIZE 20
  43. #define ZIIRAVE_FIRM_PKT_DATA_SIZE 16
  44. #define ZIIRAVE_FIRM_FLASH_MEMORY_START (2 * 0x1600)
  45. #define ZIIRAVE_FIRM_FLASH_MEMORY_END (2 * 0x2bbf)
  46. #define ZIIRAVE_FIRM_PAGE_SIZE 128
  47. /* Received and ready for next Download packet. */
  48. #define ZIIRAVE_FIRM_DOWNLOAD_ACK 1
  49. /* Firmware commands */
  50. #define ZIIRAVE_CMD_DOWNLOAD_START 0x10
  51. #define ZIIRAVE_CMD_DOWNLOAD_END 0x11
  52. #define ZIIRAVE_CMD_DOWNLOAD_SET_READ_ADDR 0x12
  53. #define ZIIRAVE_CMD_DOWNLOAD_READ_BYTE 0x13
  54. #define ZIIRAVE_CMD_RESET_PROCESSOR 0x0b
  55. #define ZIIRAVE_CMD_JUMP_TO_BOOTLOADER 0x0c
  56. #define ZIIRAVE_CMD_DOWNLOAD_PACKET 0x0e
  57. #define ZIIRAVE_CMD_JUMP_TO_BOOTLOADER_MAGIC 1
  58. #define ZIIRAVE_CMD_RESET_PROCESSOR_MAGIC 1
  59. struct ziirave_wdt_rev {
  60. unsigned char major;
  61. unsigned char minor;
  62. };
  63. struct ziirave_wdt_data {
  64. struct mutex sysfs_mutex;
  65. struct watchdog_device wdd;
  66. struct ziirave_wdt_rev bootloader_rev;
  67. struct ziirave_wdt_rev firmware_rev;
  68. int reset_reason;
  69. };
  70. static int wdt_timeout;
  71. module_param(wdt_timeout, int, 0);
  72. MODULE_PARM_DESC(wdt_timeout, "Watchdog timeout in seconds");
  73. static int reset_duration;
  74. module_param(reset_duration, int, 0);
  75. MODULE_PARM_DESC(reset_duration,
  76. "Watchdog reset pulse duration in milliseconds");
  77. static bool nowayout = WATCHDOG_NOWAYOUT;
  78. module_param(nowayout, bool, 0);
  79. MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started default="
  80. __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
  81. static int ziirave_wdt_revision(struct i2c_client *client,
  82. struct ziirave_wdt_rev *rev, u8 command)
  83. {
  84. int ret;
  85. ret = i2c_smbus_read_byte_data(client, command);
  86. if (ret < 0)
  87. return ret;
  88. rev->major = ret;
  89. ret = i2c_smbus_read_byte_data(client, command + 1);
  90. if (ret < 0)
  91. return ret;
  92. rev->minor = ret;
  93. return 0;
  94. }
  95. static int ziirave_wdt_set_state(struct watchdog_device *wdd, int state)
  96. {
  97. struct i2c_client *client = to_i2c_client(wdd->parent);
  98. return i2c_smbus_write_byte_data(client, ZIIRAVE_WDT_STATE, state);
  99. }
  100. static int ziirave_wdt_start(struct watchdog_device *wdd)
  101. {
  102. return ziirave_wdt_set_state(wdd, ZIIRAVE_STATE_ON);
  103. }
  104. static int ziirave_wdt_stop(struct watchdog_device *wdd)
  105. {
  106. return ziirave_wdt_set_state(wdd, ZIIRAVE_STATE_OFF);
  107. }
  108. static int ziirave_wdt_ping(struct watchdog_device *wdd)
  109. {
  110. struct i2c_client *client = to_i2c_client(wdd->parent);
  111. return i2c_smbus_write_byte_data(client, ZIIRAVE_WDT_PING,
  112. ZIIRAVE_PING_VALUE);
  113. }
  114. static int ziirave_wdt_set_timeout(struct watchdog_device *wdd,
  115. unsigned int timeout)
  116. {
  117. struct i2c_client *client = to_i2c_client(wdd->parent);
  118. int ret;
  119. ret = i2c_smbus_write_byte_data(client, ZIIRAVE_WDT_TIMEOUT, timeout);
  120. if (!ret)
  121. wdd->timeout = timeout;
  122. return ret;
  123. }
  124. static unsigned int ziirave_wdt_get_timeleft(struct watchdog_device *wdd)
  125. {
  126. struct i2c_client *client = to_i2c_client(wdd->parent);
  127. int ret;
  128. ret = i2c_smbus_read_byte_data(client, ZIIRAVE_WDT_TIME_LEFT);
  129. if (ret < 0)
  130. ret = 0;
  131. return ret;
  132. }
  133. static int ziirave_firm_read_ack(struct watchdog_device *wdd)
  134. {
  135. struct i2c_client *client = to_i2c_client(wdd->parent);
  136. int ret;
  137. ret = i2c_smbus_read_byte(client);
  138. if (ret < 0) {
  139. dev_err(&client->dev, "Failed to read status byte\n");
  140. return ret;
  141. }
  142. return ret == ZIIRAVE_FIRM_DOWNLOAD_ACK ? 0 : -EIO;
  143. }
  144. static int ziirave_firm_set_read_addr(struct watchdog_device *wdd, u32 addr)
  145. {
  146. struct i2c_client *client = to_i2c_client(wdd->parent);
  147. const u16 addr16 = (u16)addr / 2;
  148. u8 address[2];
  149. put_unaligned_le16(addr16, address);
  150. return i2c_smbus_write_block_data(client,
  151. ZIIRAVE_CMD_DOWNLOAD_SET_READ_ADDR,
  152. sizeof(address), address);
  153. }
  154. static bool ziirave_firm_addr_readonly(u32 addr)
  155. {
  156. return addr < ZIIRAVE_FIRM_FLASH_MEMORY_START ||
  157. addr > ZIIRAVE_FIRM_FLASH_MEMORY_END;
  158. }
  159. /*
  160. * ziirave_firm_write_pkt() - Build and write a firmware packet
  161. *
  162. * A packet to send to the firmware is composed by following bytes:
  163. * Length | Addr0 | Addr1 | Data0 .. Data15 | Checksum |
  164. * Where,
  165. * Length: A data byte containing the length of the data.
  166. * Addr0: Low byte of the address.
  167. * Addr1: High byte of the address.
  168. * Data0 .. Data15: Array of 16 bytes of data.
  169. * Checksum: Checksum byte to verify data integrity.
  170. */
  171. static int __ziirave_firm_write_pkt(struct watchdog_device *wdd,
  172. u32 addr, const u8 *data, u8 len)
  173. {
  174. const u16 addr16 = (u16)addr / 2;
  175. struct i2c_client *client = to_i2c_client(wdd->parent);
  176. u8 i, checksum = 0, packet[ZIIRAVE_FIRM_PKT_TOTAL_SIZE];
  177. int ret;
  178. /* Check max data size */
  179. if (len > ZIIRAVE_FIRM_PKT_DATA_SIZE) {
  180. dev_err(&client->dev, "Firmware packet too long (%d)\n",
  181. len);
  182. return -EMSGSIZE;
  183. }
  184. /*
  185. * Ignore packets that are targeting program memory outisde of
  186. * app partition, since they will be ignored by the
  187. * bootloader. At the same time, we need to make sure we'll
  188. * allow zero length packet that will be sent as the last step
  189. * of firmware update
  190. */
  191. if (len && ziirave_firm_addr_readonly(addr))
  192. return 0;
  193. /* Packet length */
  194. packet[0] = len;
  195. /* Packet address */
  196. put_unaligned_le16(addr16, packet + 1);
  197. memcpy(packet + 3, data, len);
  198. memset(packet + 3 + len, 0, ZIIRAVE_FIRM_PKT_DATA_SIZE - len);
  199. /* Packet checksum */
  200. for (i = 0; i < len + 3; i++)
  201. checksum += packet[i];
  202. packet[ZIIRAVE_FIRM_PKT_TOTAL_SIZE - 1] = checksum;
  203. ret = i2c_smbus_write_block_data(client, ZIIRAVE_CMD_DOWNLOAD_PACKET,
  204. sizeof(packet), packet);
  205. if (ret) {
  206. dev_err(&client->dev,
  207. "Failed to send DOWNLOAD_PACKET: %d\n", ret);
  208. return ret;
  209. }
  210. ret = ziirave_firm_read_ack(wdd);
  211. if (ret)
  212. dev_err(&client->dev,
  213. "Failed to write firmware packet at address 0x%04x: %d\n",
  214. addr, ret);
  215. return ret;
  216. }
  217. static int ziirave_firm_write_pkt(struct watchdog_device *wdd,
  218. u32 addr, const u8 *data, u8 len)
  219. {
  220. const u8 max_write_len = ZIIRAVE_FIRM_PAGE_SIZE -
  221. (addr - ALIGN_DOWN(addr, ZIIRAVE_FIRM_PAGE_SIZE));
  222. int ret;
  223. if (len > max_write_len) {
  224. /*
  225. * If data crossed page boundary we need to split this
  226. * write in two
  227. */
  228. ret = __ziirave_firm_write_pkt(wdd, addr, data, max_write_len);
  229. if (ret)
  230. return ret;
  231. addr += max_write_len;
  232. data += max_write_len;
  233. len -= max_write_len;
  234. }
  235. return __ziirave_firm_write_pkt(wdd, addr, data, len);
  236. }
  237. static int ziirave_firm_verify(struct watchdog_device *wdd,
  238. const struct firmware *fw)
  239. {
  240. struct i2c_client *client = to_i2c_client(wdd->parent);
  241. const struct ihex_binrec *rec;
  242. int i, ret;
  243. u8 data[ZIIRAVE_FIRM_PKT_DATA_SIZE];
  244. for (rec = (void *)fw->data; rec; rec = ihex_next_binrec(rec)) {
  245. const u16 len = be16_to_cpu(rec->len);
  246. const u32 addr = be32_to_cpu(rec->addr);
  247. if (ziirave_firm_addr_readonly(addr))
  248. continue;
  249. ret = ziirave_firm_set_read_addr(wdd, addr);
  250. if (ret) {
  251. dev_err(&client->dev,
  252. "Failed to send SET_READ_ADDR command: %d\n",
  253. ret);
  254. return ret;
  255. }
  256. for (i = 0; i < len; i++) {
  257. ret = i2c_smbus_read_byte_data(client,
  258. ZIIRAVE_CMD_DOWNLOAD_READ_BYTE);
  259. if (ret < 0) {
  260. dev_err(&client->dev,
  261. "Failed to READ DATA: %d\n", ret);
  262. return ret;
  263. }
  264. data[i] = ret;
  265. }
  266. if (memcmp(data, rec->data, len)) {
  267. dev_err(&client->dev,
  268. "Firmware mismatch at address 0x%04x\n", addr);
  269. return -EINVAL;
  270. }
  271. }
  272. return 0;
  273. }
  274. static int ziirave_firm_upload(struct watchdog_device *wdd,
  275. const struct firmware *fw)
  276. {
  277. struct i2c_client *client = to_i2c_client(wdd->parent);
  278. const struct ihex_binrec *rec;
  279. int ret;
  280. ret = i2c_smbus_write_byte_data(client,
  281. ZIIRAVE_CMD_JUMP_TO_BOOTLOADER,
  282. ZIIRAVE_CMD_JUMP_TO_BOOTLOADER_MAGIC);
  283. if (ret) {
  284. dev_err(&client->dev, "Failed to jump to bootloader\n");
  285. return ret;
  286. }
  287. msleep(500);
  288. ret = i2c_smbus_write_byte(client, ZIIRAVE_CMD_DOWNLOAD_START);
  289. if (ret) {
  290. dev_err(&client->dev, "Failed to start download\n");
  291. return ret;
  292. }
  293. ret = ziirave_firm_read_ack(wdd);
  294. if (ret) {
  295. dev_err(&client->dev, "No ACK for start download\n");
  296. return ret;
  297. }
  298. msleep(500);
  299. for (rec = (void *)fw->data; rec; rec = ihex_next_binrec(rec)) {
  300. ret = ziirave_firm_write_pkt(wdd, be32_to_cpu(rec->addr),
  301. rec->data, be16_to_cpu(rec->len));
  302. if (ret)
  303. return ret;
  304. }
  305. /*
  306. * Finish firmware download process by sending a zero length
  307. * payload
  308. */
  309. ret = ziirave_firm_write_pkt(wdd, 0, NULL, 0);
  310. if (ret) {
  311. dev_err(&client->dev, "Failed to send EMPTY packet: %d\n", ret);
  312. return ret;
  313. }
  314. /* This sleep seems to be required */
  315. msleep(20);
  316. /* Start firmware verification */
  317. ret = ziirave_firm_verify(wdd, fw);
  318. if (ret) {
  319. dev_err(&client->dev,
  320. "Failed to verify firmware: %d\n", ret);
  321. return ret;
  322. }
  323. /* End download operation */
  324. ret = i2c_smbus_write_byte(client, ZIIRAVE_CMD_DOWNLOAD_END);
  325. if (ret) {
  326. dev_err(&client->dev,
  327. "Failed to end firmware download: %d\n", ret);
  328. return ret;
  329. }
  330. /* Reset the processor */
  331. ret = i2c_smbus_write_byte_data(client,
  332. ZIIRAVE_CMD_RESET_PROCESSOR,
  333. ZIIRAVE_CMD_RESET_PROCESSOR_MAGIC);
  334. if (ret) {
  335. dev_err(&client->dev,
  336. "Failed to reset the watchdog: %d\n", ret);
  337. return ret;
  338. }
  339. msleep(500);
  340. return 0;
  341. }
  342. static const struct watchdog_info ziirave_wdt_info = {
  343. .options = WDIOF_SETTIMEOUT | WDIOF_MAGICCLOSE | WDIOF_KEEPALIVEPING,
  344. .identity = "RAVE Switch Watchdog",
  345. };
  346. static const struct watchdog_ops ziirave_wdt_ops = {
  347. .owner = THIS_MODULE,
  348. .start = ziirave_wdt_start,
  349. .stop = ziirave_wdt_stop,
  350. .ping = ziirave_wdt_ping,
  351. .set_timeout = ziirave_wdt_set_timeout,
  352. .get_timeleft = ziirave_wdt_get_timeleft,
  353. };
  354. static ssize_t ziirave_wdt_sysfs_show_firm(struct device *dev,
  355. struct device_attribute *attr,
  356. char *buf)
  357. {
  358. struct i2c_client *client = to_i2c_client(dev->parent);
  359. struct ziirave_wdt_data *w_priv = i2c_get_clientdata(client);
  360. int ret;
  361. ret = mutex_lock_interruptible(&w_priv->sysfs_mutex);
  362. if (ret)
  363. return ret;
  364. ret = sysfs_emit(buf, "02.%02u.%02u\n",
  365. w_priv->firmware_rev.major,
  366. w_priv->firmware_rev.minor);
  367. mutex_unlock(&w_priv->sysfs_mutex);
  368. return ret;
  369. }
  370. static DEVICE_ATTR(firmware_version, S_IRUGO, ziirave_wdt_sysfs_show_firm,
  371. NULL);
  372. static ssize_t ziirave_wdt_sysfs_show_boot(struct device *dev,
  373. struct device_attribute *attr,
  374. char *buf)
  375. {
  376. struct i2c_client *client = to_i2c_client(dev->parent);
  377. struct ziirave_wdt_data *w_priv = i2c_get_clientdata(client);
  378. int ret;
  379. ret = mutex_lock_interruptible(&w_priv->sysfs_mutex);
  380. if (ret)
  381. return ret;
  382. ret = sysfs_emit(buf, "01.%02u.%02u\n",
  383. w_priv->bootloader_rev.major,
  384. w_priv->bootloader_rev.minor);
  385. mutex_unlock(&w_priv->sysfs_mutex);
  386. return ret;
  387. }
  388. static DEVICE_ATTR(bootloader_version, S_IRUGO, ziirave_wdt_sysfs_show_boot,
  389. NULL);
  390. static ssize_t ziirave_wdt_sysfs_show_reason(struct device *dev,
  391. struct device_attribute *attr,
  392. char *buf)
  393. {
  394. struct i2c_client *client = to_i2c_client(dev->parent);
  395. struct ziirave_wdt_data *w_priv = i2c_get_clientdata(client);
  396. int ret;
  397. ret = mutex_lock_interruptible(&w_priv->sysfs_mutex);
  398. if (ret)
  399. return ret;
  400. ret = sysfs_emit(buf, "%s\n", ziirave_reasons[w_priv->reset_reason]);
  401. mutex_unlock(&w_priv->sysfs_mutex);
  402. return ret;
  403. }
  404. static DEVICE_ATTR(reset_reason, S_IRUGO, ziirave_wdt_sysfs_show_reason,
  405. NULL);
  406. static ssize_t ziirave_wdt_sysfs_store_firm(struct device *dev,
  407. struct device_attribute *attr,
  408. const char *buf, size_t count)
  409. {
  410. struct i2c_client *client = to_i2c_client(dev->parent);
  411. struct ziirave_wdt_data *w_priv = i2c_get_clientdata(client);
  412. const struct firmware *fw;
  413. int err;
  414. err = request_ihex_firmware(&fw, ZIIRAVE_FW_NAME, dev);
  415. if (err) {
  416. dev_err(&client->dev, "Failed to request ihex firmware\n");
  417. return err;
  418. }
  419. err = mutex_lock_interruptible(&w_priv->sysfs_mutex);
  420. if (err)
  421. goto release_firmware;
  422. err = ziirave_firm_upload(&w_priv->wdd, fw);
  423. if (err) {
  424. dev_err(&client->dev, "The firmware update failed: %d\n", err);
  425. goto unlock_mutex;
  426. }
  427. /* Update firmware version */
  428. err = ziirave_wdt_revision(client, &w_priv->firmware_rev,
  429. ZIIRAVE_WDT_FIRM_VER_MAJOR);
  430. if (err) {
  431. dev_err(&client->dev, "Failed to read firmware version: %d\n",
  432. err);
  433. goto unlock_mutex;
  434. }
  435. dev_info(&client->dev,
  436. "Firmware updated to version 02.%02u.%02u\n",
  437. w_priv->firmware_rev.major, w_priv->firmware_rev.minor);
  438. /* Restore the watchdog timeout */
  439. err = ziirave_wdt_set_timeout(&w_priv->wdd, w_priv->wdd.timeout);
  440. if (err)
  441. dev_err(&client->dev, "Failed to set timeout: %d\n", err);
  442. unlock_mutex:
  443. mutex_unlock(&w_priv->sysfs_mutex);
  444. release_firmware:
  445. release_firmware(fw);
  446. return err ? err : count;
  447. }
  448. static DEVICE_ATTR(update_firmware, S_IWUSR, NULL,
  449. ziirave_wdt_sysfs_store_firm);
  450. static struct attribute *ziirave_wdt_attrs[] = {
  451. &dev_attr_firmware_version.attr,
  452. &dev_attr_bootloader_version.attr,
  453. &dev_attr_reset_reason.attr,
  454. &dev_attr_update_firmware.attr,
  455. NULL
  456. };
  457. ATTRIBUTE_GROUPS(ziirave_wdt);
  458. static int ziirave_wdt_init_duration(struct i2c_client *client)
  459. {
  460. int ret;
  461. if (!reset_duration) {
  462. /* See if the reset pulse duration is provided in an of_node */
  463. if (!client->dev.of_node)
  464. ret = -ENODEV;
  465. else
  466. ret = of_property_read_u32(client->dev.of_node,
  467. "reset-duration-ms",
  468. &reset_duration);
  469. if (ret) {
  470. dev_info(&client->dev,
  471. "No reset pulse duration specified, using default\n");
  472. return 0;
  473. }
  474. }
  475. if (reset_duration < 1 || reset_duration > 255)
  476. return -EINVAL;
  477. dev_info(&client->dev, "Setting reset duration to %dms",
  478. reset_duration);
  479. return i2c_smbus_write_byte_data(client, ZIIRAVE_WDT_RESET_DURATION,
  480. reset_duration);
  481. }
  482. static int ziirave_wdt_probe(struct i2c_client *client,
  483. const struct i2c_device_id *id)
  484. {
  485. int ret;
  486. struct ziirave_wdt_data *w_priv;
  487. int val;
  488. if (!i2c_check_functionality(client->adapter,
  489. I2C_FUNC_SMBUS_BYTE |
  490. I2C_FUNC_SMBUS_BYTE_DATA |
  491. I2C_FUNC_SMBUS_WRITE_BLOCK_DATA))
  492. return -ENODEV;
  493. w_priv = devm_kzalloc(&client->dev, sizeof(*w_priv), GFP_KERNEL);
  494. if (!w_priv)
  495. return -ENOMEM;
  496. mutex_init(&w_priv->sysfs_mutex);
  497. w_priv->wdd.info = &ziirave_wdt_info;
  498. w_priv->wdd.ops = &ziirave_wdt_ops;
  499. w_priv->wdd.min_timeout = ZIIRAVE_TIMEOUT_MIN;
  500. w_priv->wdd.max_timeout = ZIIRAVE_TIMEOUT_MAX;
  501. w_priv->wdd.parent = &client->dev;
  502. w_priv->wdd.groups = ziirave_wdt_groups;
  503. watchdog_init_timeout(&w_priv->wdd, wdt_timeout, &client->dev);
  504. /*
  505. * The default value set in the watchdog should be perfectly valid, so
  506. * pass that in if we haven't provided one via the module parameter or
  507. * of property.
  508. */
  509. if (w_priv->wdd.timeout == 0) {
  510. val = i2c_smbus_read_byte_data(client, ZIIRAVE_WDT_TIMEOUT);
  511. if (val < 0) {
  512. dev_err(&client->dev, "Failed to read timeout\n");
  513. return val;
  514. }
  515. if (val > ZIIRAVE_TIMEOUT_MAX ||
  516. val < ZIIRAVE_TIMEOUT_MIN)
  517. val = ZIIRAVE_TIMEOUT_DEFAULT;
  518. w_priv->wdd.timeout = val;
  519. }
  520. ret = ziirave_wdt_set_timeout(&w_priv->wdd, w_priv->wdd.timeout);
  521. if (ret) {
  522. dev_err(&client->dev, "Failed to set timeout\n");
  523. return ret;
  524. }
  525. dev_info(&client->dev, "Timeout set to %ds\n", w_priv->wdd.timeout);
  526. watchdog_set_nowayout(&w_priv->wdd, nowayout);
  527. i2c_set_clientdata(client, w_priv);
  528. /* If in unconfigured state, set to stopped */
  529. val = i2c_smbus_read_byte_data(client, ZIIRAVE_WDT_STATE);
  530. if (val < 0) {
  531. dev_err(&client->dev, "Failed to read state\n");
  532. return val;
  533. }
  534. if (val == ZIIRAVE_STATE_INITIAL)
  535. ziirave_wdt_stop(&w_priv->wdd);
  536. ret = ziirave_wdt_init_duration(client);
  537. if (ret) {
  538. dev_err(&client->dev, "Failed to init duration\n");
  539. return ret;
  540. }
  541. ret = ziirave_wdt_revision(client, &w_priv->firmware_rev,
  542. ZIIRAVE_WDT_FIRM_VER_MAJOR);
  543. if (ret) {
  544. dev_err(&client->dev, "Failed to read firmware version\n");
  545. return ret;
  546. }
  547. dev_info(&client->dev,
  548. "Firmware version: 02.%02u.%02u\n",
  549. w_priv->firmware_rev.major, w_priv->firmware_rev.minor);
  550. ret = ziirave_wdt_revision(client, &w_priv->bootloader_rev,
  551. ZIIRAVE_WDT_BOOT_VER_MAJOR);
  552. if (ret) {
  553. dev_err(&client->dev, "Failed to read bootloader version\n");
  554. return ret;
  555. }
  556. dev_info(&client->dev,
  557. "Bootloader version: 01.%02u.%02u\n",
  558. w_priv->bootloader_rev.major, w_priv->bootloader_rev.minor);
  559. w_priv->reset_reason = i2c_smbus_read_byte_data(client,
  560. ZIIRAVE_WDT_RESET_REASON);
  561. if (w_priv->reset_reason < 0) {
  562. dev_err(&client->dev, "Failed to read reset reason\n");
  563. return w_priv->reset_reason;
  564. }
  565. if (w_priv->reset_reason >= ARRAY_SIZE(ziirave_reasons) ||
  566. !ziirave_reasons[w_priv->reset_reason]) {
  567. dev_err(&client->dev, "Invalid reset reason\n");
  568. return -ENODEV;
  569. }
  570. ret = watchdog_register_device(&w_priv->wdd);
  571. return ret;
  572. }
  573. static void ziirave_wdt_remove(struct i2c_client *client)
  574. {
  575. struct ziirave_wdt_data *w_priv = i2c_get_clientdata(client);
  576. watchdog_unregister_device(&w_priv->wdd);
  577. }
  578. static const struct i2c_device_id ziirave_wdt_id[] = {
  579. { "rave-wdt", 0 },
  580. { }
  581. };
  582. MODULE_DEVICE_TABLE(i2c, ziirave_wdt_id);
  583. static const struct of_device_id zrv_wdt_of_match[] = {
  584. { .compatible = "zii,rave-wdt", },
  585. { },
  586. };
  587. MODULE_DEVICE_TABLE(of, zrv_wdt_of_match);
  588. static struct i2c_driver ziirave_wdt_driver = {
  589. .driver = {
  590. .name = "ziirave_wdt",
  591. .of_match_table = zrv_wdt_of_match,
  592. },
  593. .probe = ziirave_wdt_probe,
  594. .remove = ziirave_wdt_remove,
  595. .id_table = ziirave_wdt_id,
  596. };
  597. module_i2c_driver(ziirave_wdt_driver);
  598. MODULE_AUTHOR("Martyn Welch <[email protected]");
  599. MODULE_DESCRIPTION("Zodiac Aerospace RAVE Switch Watchdog Processor Driver");
  600. MODULE_LICENSE("GPL");