nct7904.c 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * nct7904.c - driver for Nuvoton NCT7904D.
  4. *
  5. * Copyright (c) 2015 Kontron
  6. * Author: Vadim V. Vlasov <vvlasov@dev.rtsoft.ru>
  7. *
  8. * Copyright (c) 2019 Advantech
  9. * Author: Amy.Shih <amy.shih@advantech.com.tw>
  10. *
  11. * Copyright (c) 2020 Advantech
  12. * Author: Yuechao Zhao <yuechao.zhao@advantech.com.cn>
  13. *
  14. * Supports the following chips:
  15. *
  16. * Chip #vin #fan #pwm #temp #dts chip ID
  17. * nct7904d 20 12 4 5 8 0xc5
  18. */
  19. #include <linux/module.h>
  20. #include <linux/device.h>
  21. #include <linux/init.h>
  22. #include <linux/i2c.h>
  23. #include <linux/hwmon.h>
  24. #include <linux/watchdog.h>
  25. #define VENDOR_ID_REG 0x7A /* Any bank */
  26. #define NUVOTON_ID 0x50
  27. #define CHIP_ID_REG 0x7B /* Any bank */
  28. #define NCT7904_ID 0xC5
  29. #define DEVICE_ID_REG 0x7C /* Any bank */
  30. #define BANK_SEL_REG 0xFF
  31. #define BANK_0 0x00
  32. #define BANK_1 0x01
  33. #define BANK_2 0x02
  34. #define BANK_3 0x03
  35. #define BANK_4 0x04
  36. #define BANK_MAX 0x04
  37. #define FANIN_MAX 12 /* Counted from 1 */
  38. #define VSEN_MAX 21 /* VSEN1..14, 3VDD, VBAT, V3VSB,
  39. LTD (not a voltage), VSEN17..19 */
  40. #define FANCTL_MAX 4 /* Counted from 1 */
  41. #define TCPU_MAX 8 /* Counted from 1 */
  42. #define TEMP_MAX 4 /* Counted from 1 */
  43. #define SMI_STS_MAX 10 /* Counted from 1 */
  44. #define VT_ADC_CTRL0_REG 0x20 /* Bank 0 */
  45. #define VT_ADC_CTRL1_REG 0x21 /* Bank 0 */
  46. #define VT_ADC_CTRL2_REG 0x22 /* Bank 0 */
  47. #define FANIN_CTRL0_REG 0x24
  48. #define FANIN_CTRL1_REG 0x25
  49. #define DTS_T_CTRL0_REG 0x26
  50. #define DTS_T_CTRL1_REG 0x27
  51. #define VT_ADC_MD_REG 0x2E
  52. #define VSEN1_HV_LL_REG 0x02 /* Bank 1; 2 regs (HV/LV) per sensor */
  53. #define VSEN1_LV_LL_REG 0x03 /* Bank 1; 2 regs (HV/LV) per sensor */
  54. #define VSEN1_HV_HL_REG 0x00 /* Bank 1; 2 regs (HV/LV) per sensor */
  55. #define VSEN1_LV_HL_REG 0x01 /* Bank 1; 2 regs (HV/LV) per sensor */
  56. #define SMI_STS1_REG 0xC1 /* Bank 0; SMI Status Register */
  57. #define SMI_STS3_REG 0xC3 /* Bank 0; SMI Status Register */
  58. #define SMI_STS5_REG 0xC5 /* Bank 0; SMI Status Register */
  59. #define SMI_STS7_REG 0xC7 /* Bank 0; SMI Status Register */
  60. #define SMI_STS8_REG 0xC8 /* Bank 0; SMI Status Register */
  61. #define VSEN1_HV_REG 0x40 /* Bank 0; 2 regs (HV/LV) per sensor */
  62. #define TEMP_CH1_HV_REG 0x42 /* Bank 0; same as VSEN2_HV */
  63. #define LTD_HV_REG 0x62 /* Bank 0; 2 regs in VSEN range */
  64. #define LTD_HV_HL_REG 0x44 /* Bank 1; 1 reg for LTD */
  65. #define LTD_LV_HL_REG 0x45 /* Bank 1; 1 reg for LTD */
  66. #define LTD_HV_LL_REG 0x46 /* Bank 1; 1 reg for LTD */
  67. #define LTD_LV_LL_REG 0x47 /* Bank 1; 1 reg for LTD */
  68. #define TEMP_CH1_CH_REG 0x05 /* Bank 1; 1 reg for LTD */
  69. #define TEMP_CH1_W_REG 0x06 /* Bank 1; 1 reg for LTD */
  70. #define TEMP_CH1_WH_REG 0x07 /* Bank 1; 1 reg for LTD */
  71. #define TEMP_CH1_C_REG 0x04 /* Bank 1; 1 reg per sensor */
  72. #define DTS_T_CPU1_C_REG 0x90 /* Bank 1; 1 reg per sensor */
  73. #define DTS_T_CPU1_CH_REG 0x91 /* Bank 1; 1 reg per sensor */
  74. #define DTS_T_CPU1_W_REG 0x92 /* Bank 1; 1 reg per sensor */
  75. #define DTS_T_CPU1_WH_REG 0x93 /* Bank 1; 1 reg per sensor */
  76. #define FANIN1_HV_REG 0x80 /* Bank 0; 2 regs (HV/LV) per sensor */
  77. #define FANIN1_HV_HL_REG 0x60 /* Bank 1; 2 regs (HV/LV) per sensor */
  78. #define FANIN1_LV_HL_REG 0x61 /* Bank 1; 2 regs (HV/LV) per sensor */
  79. #define T_CPU1_HV_REG 0xA0 /* Bank 0; 2 regs (HV/LV) per sensor */
  80. #define PRTS_REG 0x03 /* Bank 2 */
  81. #define PFE_REG 0x00 /* Bank 2; PECI Function Enable */
  82. #define TSI_CTRL_REG 0x50 /* Bank 2; TSI Control Register */
  83. #define FANCTL1_FMR_REG 0x00 /* Bank 3; 1 reg per channel */
  84. #define FANCTL1_OUT_REG 0x10 /* Bank 3; 1 reg per channel */
  85. #define WDT_LOCK_REG 0xE0 /* W/O Lock Watchdog Register */
  86. #define WDT_EN_REG 0xE1 /* R/O Watchdog Enable Register */
  87. #define WDT_STS_REG 0xE2 /* R/O Watchdog Status Register */
  88. #define WDT_TIMER_REG 0xE3 /* R/W Watchdog Timer Register */
  89. #define WDT_SOFT_EN 0x55 /* Enable soft watchdog timer */
  90. #define WDT_SOFT_DIS 0xAA /* Disable soft watchdog timer */
  91. #define VOLT_MONITOR_MODE 0x0
  92. #define THERMAL_DIODE_MODE 0x1
  93. #define THERMISTOR_MODE 0x3
  94. #define ENABLE_TSI BIT(1)
  95. #define WATCHDOG_TIMEOUT 1 /* 1 minute default timeout */
  96. /*The timeout range is 1-255 minutes*/
  97. #define MIN_TIMEOUT (1 * 60)
  98. #define MAX_TIMEOUT (255 * 60)
  99. static int timeout;
  100. module_param(timeout, int, 0);
  101. MODULE_PARM_DESC(timeout, "Watchdog timeout in minutes. 1 <= timeout <= 255, default="
  102. __MODULE_STRING(WATCHDOG_TIMEOUT) ".");
  103. static bool nowayout = WATCHDOG_NOWAYOUT;
  104. module_param(nowayout, bool, 0);
  105. MODULE_PARM_DESC(nowayout, "Watchdog cannot be stopped once started (default="
  106. __MODULE_STRING(WATCHDOG_NOWAYOUT) ")");
  107. static const unsigned short normal_i2c[] = {
  108. 0x2d, 0x2e, I2C_CLIENT_END
  109. };
  110. struct nct7904_data {
  111. struct i2c_client *client;
  112. struct watchdog_device wdt;
  113. int bank_sel;
  114. u32 fanin_mask;
  115. u32 vsen_mask;
  116. u32 tcpu_mask;
  117. u8 fan_mode[FANCTL_MAX];
  118. u8 enable_dts;
  119. u8 has_dts;
  120. u8 temp_mode; /* 0: TR mode, 1: TD mode */
  121. u8 fan_alarm[2];
  122. u8 vsen_alarm[3];
  123. };
  124. /* Access functions */
  125. static int nct7904_bank_select(struct nct7904_data *data, unsigned int bank)
  126. {
  127. int ret;
  128. if (data->bank_sel == bank)
  129. return 0;
  130. ret = i2c_smbus_write_byte_data(data->client, BANK_SEL_REG, bank);
  131. if (ret < 0) {
  132. data->bank_sel = -1;
  133. return ret;
  134. }
  135. data->bank_sel = bank;
  136. return 0;
  137. }
  138. /* Read 1-byte register. Returns unsigned reg or -ERRNO on error. */
  139. static int nct7904_read_reg(struct nct7904_data *data,
  140. unsigned int bank, unsigned int reg)
  141. {
  142. struct i2c_client *client = data->client;
  143. int ret;
  144. ret = nct7904_bank_select(data, bank);
  145. if (ret < 0)
  146. return ret;
  147. return i2c_smbus_read_byte_data(client, reg);
  148. }
  149. /*
  150. * Read 2-byte register. Returns register in big-endian format or
  151. * -ERRNO on error.
  152. */
  153. static int nct7904_read_reg16(struct nct7904_data *data,
  154. unsigned int bank, unsigned int reg)
  155. {
  156. struct i2c_client *client = data->client;
  157. int ret, hi;
  158. ret = nct7904_bank_select(data, bank);
  159. if (ret < 0)
  160. return ret;
  161. hi = i2c_smbus_read_byte_data(client, reg);
  162. if (hi < 0)
  163. return hi;
  164. ret = i2c_smbus_read_byte_data(client, reg + 1);
  165. if (ret < 0)
  166. return ret;
  167. return ret | (hi << 8);
  168. }
  169. /* Write 1-byte register. Returns 0 or -ERRNO on error. */
  170. static int nct7904_write_reg(struct nct7904_data *data,
  171. unsigned int bank, unsigned int reg, u8 val)
  172. {
  173. struct i2c_client *client = data->client;
  174. int ret;
  175. ret = nct7904_bank_select(data, bank);
  176. if (ret < 0)
  177. return ret;
  178. return i2c_smbus_write_byte_data(client, reg, val);
  179. }
  180. static int nct7904_read_fan(struct device *dev, u32 attr, int channel,
  181. long *val)
  182. {
  183. struct nct7904_data *data = dev_get_drvdata(dev);
  184. unsigned int cnt, rpm;
  185. int ret;
  186. switch (attr) {
  187. case hwmon_fan_input:
  188. ret = nct7904_read_reg16(data, BANK_0,
  189. FANIN1_HV_REG + channel * 2);
  190. if (ret < 0)
  191. return ret;
  192. cnt = ((ret & 0xff00) >> 3) | (ret & 0x1f);
  193. if (cnt == 0 || cnt == 0x1fff)
  194. rpm = 0;
  195. else
  196. rpm = 1350000 / cnt;
  197. *val = rpm;
  198. return 0;
  199. case hwmon_fan_min:
  200. ret = nct7904_read_reg16(data, BANK_1,
  201. FANIN1_HV_HL_REG + channel * 2);
  202. if (ret < 0)
  203. return ret;
  204. cnt = ((ret & 0xff00) >> 3) | (ret & 0x1f);
  205. if (cnt == 0 || cnt == 0x1fff)
  206. rpm = 0;
  207. else
  208. rpm = 1350000 / cnt;
  209. *val = rpm;
  210. return 0;
  211. case hwmon_fan_alarm:
  212. ret = nct7904_read_reg(data, BANK_0,
  213. SMI_STS5_REG + (channel >> 3));
  214. if (ret < 0)
  215. return ret;
  216. if (!data->fan_alarm[channel >> 3])
  217. data->fan_alarm[channel >> 3] = ret & 0xff;
  218. else
  219. /* If there is new alarm showing up */
  220. data->fan_alarm[channel >> 3] |= (ret & 0xff);
  221. *val = (data->fan_alarm[channel >> 3] >> (channel & 0x07)) & 1;
  222. /* Needs to clean the alarm if alarm existing */
  223. if (*val)
  224. data->fan_alarm[channel >> 3] ^= 1 << (channel & 0x07);
  225. return 0;
  226. default:
  227. return -EOPNOTSUPP;
  228. }
  229. }
  230. static umode_t nct7904_fan_is_visible(const void *_data, u32 attr, int channel)
  231. {
  232. const struct nct7904_data *data = _data;
  233. switch (attr) {
  234. case hwmon_fan_input:
  235. case hwmon_fan_alarm:
  236. if (data->fanin_mask & (1 << channel))
  237. return 0444;
  238. break;
  239. case hwmon_fan_min:
  240. if (data->fanin_mask & (1 << channel))
  241. return 0644;
  242. break;
  243. default:
  244. break;
  245. }
  246. return 0;
  247. }
  248. static u8 nct7904_chan_to_index[] = {
  249. 0, /* Not used */
  250. 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
  251. 18, 19, 20, 16
  252. };
  253. static int nct7904_read_in(struct device *dev, u32 attr, int channel,
  254. long *val)
  255. {
  256. struct nct7904_data *data = dev_get_drvdata(dev);
  257. int ret, volt, index;
  258. index = nct7904_chan_to_index[channel];
  259. switch (attr) {
  260. case hwmon_in_input:
  261. ret = nct7904_read_reg16(data, BANK_0,
  262. VSEN1_HV_REG + index * 2);
  263. if (ret < 0)
  264. return ret;
  265. volt = ((ret & 0xff00) >> 5) | (ret & 0x7);
  266. if (index < 14)
  267. volt *= 2; /* 0.002V scale */
  268. else
  269. volt *= 6; /* 0.006V scale */
  270. *val = volt;
  271. return 0;
  272. case hwmon_in_min:
  273. ret = nct7904_read_reg16(data, BANK_1,
  274. VSEN1_HV_LL_REG + index * 4);
  275. if (ret < 0)
  276. return ret;
  277. volt = ((ret & 0xff00) >> 5) | (ret & 0x7);
  278. if (index < 14)
  279. volt *= 2; /* 0.002V scale */
  280. else
  281. volt *= 6; /* 0.006V scale */
  282. *val = volt;
  283. return 0;
  284. case hwmon_in_max:
  285. ret = nct7904_read_reg16(data, BANK_1,
  286. VSEN1_HV_HL_REG + index * 4);
  287. if (ret < 0)
  288. return ret;
  289. volt = ((ret & 0xff00) >> 5) | (ret & 0x7);
  290. if (index < 14)
  291. volt *= 2; /* 0.002V scale */
  292. else
  293. volt *= 6; /* 0.006V scale */
  294. *val = volt;
  295. return 0;
  296. case hwmon_in_alarm:
  297. ret = nct7904_read_reg(data, BANK_0,
  298. SMI_STS1_REG + (index >> 3));
  299. if (ret < 0)
  300. return ret;
  301. if (!data->vsen_alarm[index >> 3])
  302. data->vsen_alarm[index >> 3] = ret & 0xff;
  303. else
  304. /* If there is new alarm showing up */
  305. data->vsen_alarm[index >> 3] |= (ret & 0xff);
  306. *val = (data->vsen_alarm[index >> 3] >> (index & 0x07)) & 1;
  307. /* Needs to clean the alarm if alarm existing */
  308. if (*val)
  309. data->vsen_alarm[index >> 3] ^= 1 << (index & 0x07);
  310. return 0;
  311. default:
  312. return -EOPNOTSUPP;
  313. }
  314. }
  315. static umode_t nct7904_in_is_visible(const void *_data, u32 attr, int channel)
  316. {
  317. const struct nct7904_data *data = _data;
  318. int index = nct7904_chan_to_index[channel];
  319. switch (attr) {
  320. case hwmon_in_input:
  321. case hwmon_in_alarm:
  322. if (channel > 0 && (data->vsen_mask & BIT(index)))
  323. return 0444;
  324. break;
  325. case hwmon_in_min:
  326. case hwmon_in_max:
  327. if (channel > 0 && (data->vsen_mask & BIT(index)))
  328. return 0644;
  329. break;
  330. default:
  331. break;
  332. }
  333. return 0;
  334. }
  335. static int nct7904_read_temp(struct device *dev, u32 attr, int channel,
  336. long *val)
  337. {
  338. struct nct7904_data *data = dev_get_drvdata(dev);
  339. int ret, temp;
  340. unsigned int reg1, reg2, reg3;
  341. s8 temps;
  342. switch (attr) {
  343. case hwmon_temp_input:
  344. if (channel == 4)
  345. ret = nct7904_read_reg16(data, BANK_0, LTD_HV_REG);
  346. else if (channel < 5)
  347. ret = nct7904_read_reg16(data, BANK_0,
  348. TEMP_CH1_HV_REG + channel * 4);
  349. else
  350. ret = nct7904_read_reg16(data, BANK_0,
  351. T_CPU1_HV_REG + (channel - 5)
  352. * 2);
  353. if (ret < 0)
  354. return ret;
  355. temp = ((ret & 0xff00) >> 5) | (ret & 0x7);
  356. *val = sign_extend32(temp, 10) * 125;
  357. return 0;
  358. case hwmon_temp_alarm:
  359. if (channel == 4) {
  360. ret = nct7904_read_reg(data, BANK_0,
  361. SMI_STS3_REG);
  362. if (ret < 0)
  363. return ret;
  364. *val = (ret >> 1) & 1;
  365. } else if (channel < 4) {
  366. ret = nct7904_read_reg(data, BANK_0,
  367. SMI_STS1_REG);
  368. if (ret < 0)
  369. return ret;
  370. *val = (ret >> (((channel * 2) + 1) & 0x07)) & 1;
  371. } else {
  372. if ((channel - 5) < 4) {
  373. ret = nct7904_read_reg(data, BANK_0,
  374. SMI_STS7_REG +
  375. ((channel - 5) >> 3));
  376. if (ret < 0)
  377. return ret;
  378. *val = (ret >> ((channel - 5) & 0x07)) & 1;
  379. } else {
  380. ret = nct7904_read_reg(data, BANK_0,
  381. SMI_STS8_REG +
  382. ((channel - 5) >> 3));
  383. if (ret < 0)
  384. return ret;
  385. *val = (ret >> (((channel - 5) & 0x07) - 4))
  386. & 1;
  387. }
  388. }
  389. return 0;
  390. case hwmon_temp_type:
  391. if (channel < 5) {
  392. if ((data->tcpu_mask >> channel) & 0x01) {
  393. if ((data->temp_mode >> channel) & 0x01)
  394. *val = 3; /* TD */
  395. else
  396. *val = 4; /* TR */
  397. } else {
  398. *val = 0;
  399. }
  400. } else {
  401. if ((data->has_dts >> (channel - 5)) & 0x01) {
  402. if (data->enable_dts & ENABLE_TSI)
  403. *val = 5; /* TSI */
  404. else
  405. *val = 6; /* PECI */
  406. } else {
  407. *val = 0;
  408. }
  409. }
  410. return 0;
  411. case hwmon_temp_max:
  412. reg1 = LTD_HV_LL_REG;
  413. reg2 = TEMP_CH1_W_REG;
  414. reg3 = DTS_T_CPU1_W_REG;
  415. break;
  416. case hwmon_temp_max_hyst:
  417. reg1 = LTD_LV_LL_REG;
  418. reg2 = TEMP_CH1_WH_REG;
  419. reg3 = DTS_T_CPU1_WH_REG;
  420. break;
  421. case hwmon_temp_crit:
  422. reg1 = LTD_HV_HL_REG;
  423. reg2 = TEMP_CH1_C_REG;
  424. reg3 = DTS_T_CPU1_C_REG;
  425. break;
  426. case hwmon_temp_crit_hyst:
  427. reg1 = LTD_LV_HL_REG;
  428. reg2 = TEMP_CH1_CH_REG;
  429. reg3 = DTS_T_CPU1_CH_REG;
  430. break;
  431. default:
  432. return -EOPNOTSUPP;
  433. }
  434. if (channel == 4)
  435. ret = nct7904_read_reg(data, BANK_1, reg1);
  436. else if (channel < 5)
  437. ret = nct7904_read_reg(data, BANK_1,
  438. reg2 + channel * 8);
  439. else
  440. ret = nct7904_read_reg(data, BANK_1,
  441. reg3 + (channel - 5) * 4);
  442. if (ret < 0)
  443. return ret;
  444. temps = ret;
  445. *val = temps * 1000;
  446. return 0;
  447. }
  448. static umode_t nct7904_temp_is_visible(const void *_data, u32 attr, int channel)
  449. {
  450. const struct nct7904_data *data = _data;
  451. switch (attr) {
  452. case hwmon_temp_input:
  453. case hwmon_temp_alarm:
  454. case hwmon_temp_type:
  455. if (channel < 5) {
  456. if (data->tcpu_mask & BIT(channel))
  457. return 0444;
  458. } else {
  459. if (data->has_dts & BIT(channel - 5))
  460. return 0444;
  461. }
  462. break;
  463. case hwmon_temp_max:
  464. case hwmon_temp_max_hyst:
  465. case hwmon_temp_crit:
  466. case hwmon_temp_crit_hyst:
  467. if (channel < 5) {
  468. if (data->tcpu_mask & BIT(channel))
  469. return 0644;
  470. } else {
  471. if (data->has_dts & BIT(channel - 5))
  472. return 0644;
  473. }
  474. break;
  475. default:
  476. break;
  477. }
  478. return 0;
  479. }
  480. static int nct7904_read_pwm(struct device *dev, u32 attr, int channel,
  481. long *val)
  482. {
  483. struct nct7904_data *data = dev_get_drvdata(dev);
  484. int ret;
  485. switch (attr) {
  486. case hwmon_pwm_input:
  487. ret = nct7904_read_reg(data, BANK_3, FANCTL1_OUT_REG + channel);
  488. if (ret < 0)
  489. return ret;
  490. *val = ret;
  491. return 0;
  492. case hwmon_pwm_enable:
  493. ret = nct7904_read_reg(data, BANK_3, FANCTL1_FMR_REG + channel);
  494. if (ret < 0)
  495. return ret;
  496. *val = ret ? 2 : 1;
  497. return 0;
  498. default:
  499. return -EOPNOTSUPP;
  500. }
  501. }
  502. static int nct7904_write_temp(struct device *dev, u32 attr, int channel,
  503. long val)
  504. {
  505. struct nct7904_data *data = dev_get_drvdata(dev);
  506. int ret;
  507. unsigned int reg1, reg2, reg3;
  508. val = clamp_val(val / 1000, -128, 127);
  509. switch (attr) {
  510. case hwmon_temp_max:
  511. reg1 = LTD_HV_LL_REG;
  512. reg2 = TEMP_CH1_W_REG;
  513. reg3 = DTS_T_CPU1_W_REG;
  514. break;
  515. case hwmon_temp_max_hyst:
  516. reg1 = LTD_LV_LL_REG;
  517. reg2 = TEMP_CH1_WH_REG;
  518. reg3 = DTS_T_CPU1_WH_REG;
  519. break;
  520. case hwmon_temp_crit:
  521. reg1 = LTD_HV_HL_REG;
  522. reg2 = TEMP_CH1_C_REG;
  523. reg3 = DTS_T_CPU1_C_REG;
  524. break;
  525. case hwmon_temp_crit_hyst:
  526. reg1 = LTD_LV_HL_REG;
  527. reg2 = TEMP_CH1_CH_REG;
  528. reg3 = DTS_T_CPU1_CH_REG;
  529. break;
  530. default:
  531. return -EOPNOTSUPP;
  532. }
  533. if (channel == 4)
  534. ret = nct7904_write_reg(data, BANK_1, reg1, val);
  535. else if (channel < 5)
  536. ret = nct7904_write_reg(data, BANK_1,
  537. reg2 + channel * 8, val);
  538. else
  539. ret = nct7904_write_reg(data, BANK_1,
  540. reg3 + (channel - 5) * 4, val);
  541. return ret;
  542. }
  543. static int nct7904_write_fan(struct device *dev, u32 attr, int channel,
  544. long val)
  545. {
  546. struct nct7904_data *data = dev_get_drvdata(dev);
  547. int ret;
  548. u8 tmp;
  549. switch (attr) {
  550. case hwmon_fan_min:
  551. if (val <= 0)
  552. return -EINVAL;
  553. val = clamp_val(DIV_ROUND_CLOSEST(1350000, val), 1, 0x1fff);
  554. tmp = (val >> 5) & 0xff;
  555. ret = nct7904_write_reg(data, BANK_1,
  556. FANIN1_HV_HL_REG + channel * 2, tmp);
  557. if (ret < 0)
  558. return ret;
  559. tmp = val & 0x1f;
  560. ret = nct7904_write_reg(data, BANK_1,
  561. FANIN1_LV_HL_REG + channel * 2, tmp);
  562. return ret;
  563. default:
  564. return -EOPNOTSUPP;
  565. }
  566. }
  567. static int nct7904_write_in(struct device *dev, u32 attr, int channel,
  568. long val)
  569. {
  570. struct nct7904_data *data = dev_get_drvdata(dev);
  571. int ret, index, tmp;
  572. index = nct7904_chan_to_index[channel];
  573. if (index < 14)
  574. val = val / 2; /* 0.002V scale */
  575. else
  576. val = val / 6; /* 0.006V scale */
  577. val = clamp_val(val, 0, 0x7ff);
  578. switch (attr) {
  579. case hwmon_in_min:
  580. tmp = nct7904_read_reg(data, BANK_1,
  581. VSEN1_LV_LL_REG + index * 4);
  582. if (tmp < 0)
  583. return tmp;
  584. tmp &= ~0x7;
  585. tmp |= val & 0x7;
  586. ret = nct7904_write_reg(data, BANK_1,
  587. VSEN1_LV_LL_REG + index * 4, tmp);
  588. if (ret < 0)
  589. return ret;
  590. tmp = nct7904_read_reg(data, BANK_1,
  591. VSEN1_HV_LL_REG + index * 4);
  592. if (tmp < 0)
  593. return tmp;
  594. tmp = (val >> 3) & 0xff;
  595. ret = nct7904_write_reg(data, BANK_1,
  596. VSEN1_HV_LL_REG + index * 4, tmp);
  597. return ret;
  598. case hwmon_in_max:
  599. tmp = nct7904_read_reg(data, BANK_1,
  600. VSEN1_LV_HL_REG + index * 4);
  601. if (tmp < 0)
  602. return tmp;
  603. tmp &= ~0x7;
  604. tmp |= val & 0x7;
  605. ret = nct7904_write_reg(data, BANK_1,
  606. VSEN1_LV_HL_REG + index * 4, tmp);
  607. if (ret < 0)
  608. return ret;
  609. tmp = nct7904_read_reg(data, BANK_1,
  610. VSEN1_HV_HL_REG + index * 4);
  611. if (tmp < 0)
  612. return tmp;
  613. tmp = (val >> 3) & 0xff;
  614. ret = nct7904_write_reg(data, BANK_1,
  615. VSEN1_HV_HL_REG + index * 4, tmp);
  616. return ret;
  617. default:
  618. return -EOPNOTSUPP;
  619. }
  620. }
  621. static int nct7904_write_pwm(struct device *dev, u32 attr, int channel,
  622. long val)
  623. {
  624. struct nct7904_data *data = dev_get_drvdata(dev);
  625. int ret;
  626. switch (attr) {
  627. case hwmon_pwm_input:
  628. if (val < 0 || val > 255)
  629. return -EINVAL;
  630. ret = nct7904_write_reg(data, BANK_3, FANCTL1_OUT_REG + channel,
  631. val);
  632. return ret;
  633. case hwmon_pwm_enable:
  634. if (val < 1 || val > 2 ||
  635. (val == 2 && !data->fan_mode[channel]))
  636. return -EINVAL;
  637. ret = nct7904_write_reg(data, BANK_3, FANCTL1_FMR_REG + channel,
  638. val == 2 ? data->fan_mode[channel] : 0);
  639. return ret;
  640. default:
  641. return -EOPNOTSUPP;
  642. }
  643. }
  644. static umode_t nct7904_pwm_is_visible(const void *_data, u32 attr, int channel)
  645. {
  646. switch (attr) {
  647. case hwmon_pwm_input:
  648. case hwmon_pwm_enable:
  649. return 0644;
  650. default:
  651. return 0;
  652. }
  653. }
  654. static int nct7904_read(struct device *dev, enum hwmon_sensor_types type,
  655. u32 attr, int channel, long *val)
  656. {
  657. switch (type) {
  658. case hwmon_in:
  659. return nct7904_read_in(dev, attr, channel, val);
  660. case hwmon_fan:
  661. return nct7904_read_fan(dev, attr, channel, val);
  662. case hwmon_pwm:
  663. return nct7904_read_pwm(dev, attr, channel, val);
  664. case hwmon_temp:
  665. return nct7904_read_temp(dev, attr, channel, val);
  666. default:
  667. return -EOPNOTSUPP;
  668. }
  669. }
  670. static int nct7904_write(struct device *dev, enum hwmon_sensor_types type,
  671. u32 attr, int channel, long val)
  672. {
  673. switch (type) {
  674. case hwmon_in:
  675. return nct7904_write_in(dev, attr, channel, val);
  676. case hwmon_fan:
  677. return nct7904_write_fan(dev, attr, channel, val);
  678. case hwmon_pwm:
  679. return nct7904_write_pwm(dev, attr, channel, val);
  680. case hwmon_temp:
  681. return nct7904_write_temp(dev, attr, channel, val);
  682. default:
  683. return -EOPNOTSUPP;
  684. }
  685. }
  686. static umode_t nct7904_is_visible(const void *data,
  687. enum hwmon_sensor_types type,
  688. u32 attr, int channel)
  689. {
  690. switch (type) {
  691. case hwmon_in:
  692. return nct7904_in_is_visible(data, attr, channel);
  693. case hwmon_fan:
  694. return nct7904_fan_is_visible(data, attr, channel);
  695. case hwmon_pwm:
  696. return nct7904_pwm_is_visible(data, attr, channel);
  697. case hwmon_temp:
  698. return nct7904_temp_is_visible(data, attr, channel);
  699. default:
  700. return 0;
  701. }
  702. }
  703. /* Return 0 if detection is successful, -ENODEV otherwise */
  704. static int nct7904_detect(struct i2c_client *client,
  705. struct i2c_board_info *info)
  706. {
  707. struct i2c_adapter *adapter = client->adapter;
  708. if (!i2c_check_functionality(adapter,
  709. I2C_FUNC_SMBUS_READ_BYTE |
  710. I2C_FUNC_SMBUS_WRITE_BYTE_DATA))
  711. return -ENODEV;
  712. /* Determine the chip type. */
  713. if (i2c_smbus_read_byte_data(client, VENDOR_ID_REG) != NUVOTON_ID ||
  714. i2c_smbus_read_byte_data(client, CHIP_ID_REG) != NCT7904_ID ||
  715. (i2c_smbus_read_byte_data(client, DEVICE_ID_REG) & 0xf0) != 0x50 ||
  716. (i2c_smbus_read_byte_data(client, BANK_SEL_REG) & 0xf8) != 0x00)
  717. return -ENODEV;
  718. strscpy(info->type, "nct7904", I2C_NAME_SIZE);
  719. return 0;
  720. }
  721. static const struct hwmon_channel_info * const nct7904_info[] = {
  722. HWMON_CHANNEL_INFO(in,
  723. /* dummy, skipped in is_visible */
  724. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  725. HWMON_I_ALARM,
  726. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  727. HWMON_I_ALARM,
  728. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  729. HWMON_I_ALARM,
  730. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  731. HWMON_I_ALARM,
  732. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  733. HWMON_I_ALARM,
  734. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  735. HWMON_I_ALARM,
  736. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  737. HWMON_I_ALARM,
  738. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  739. HWMON_I_ALARM,
  740. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  741. HWMON_I_ALARM,
  742. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  743. HWMON_I_ALARM,
  744. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  745. HWMON_I_ALARM,
  746. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  747. HWMON_I_ALARM,
  748. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  749. HWMON_I_ALARM,
  750. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  751. HWMON_I_ALARM,
  752. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  753. HWMON_I_ALARM,
  754. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  755. HWMON_I_ALARM,
  756. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  757. HWMON_I_ALARM,
  758. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  759. HWMON_I_ALARM,
  760. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  761. HWMON_I_ALARM,
  762. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  763. HWMON_I_ALARM,
  764. HWMON_I_INPUT | HWMON_I_MIN | HWMON_I_MAX |
  765. HWMON_I_ALARM),
  766. HWMON_CHANNEL_INFO(fan,
  767. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  768. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  769. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  770. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  771. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  772. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  773. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  774. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  775. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  776. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  777. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM,
  778. HWMON_F_INPUT | HWMON_F_MIN | HWMON_F_ALARM),
  779. HWMON_CHANNEL_INFO(pwm,
  780. HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
  781. HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
  782. HWMON_PWM_INPUT | HWMON_PWM_ENABLE,
  783. HWMON_PWM_INPUT | HWMON_PWM_ENABLE),
  784. HWMON_CHANNEL_INFO(temp,
  785. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  786. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  787. HWMON_T_CRIT_HYST,
  788. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  789. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  790. HWMON_T_CRIT_HYST,
  791. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  792. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  793. HWMON_T_CRIT_HYST,
  794. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  795. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  796. HWMON_T_CRIT_HYST,
  797. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  798. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  799. HWMON_T_CRIT_HYST,
  800. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  801. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  802. HWMON_T_CRIT_HYST,
  803. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  804. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  805. HWMON_T_CRIT_HYST,
  806. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  807. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  808. HWMON_T_CRIT_HYST,
  809. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  810. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  811. HWMON_T_CRIT_HYST,
  812. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  813. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  814. HWMON_T_CRIT_HYST,
  815. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  816. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  817. HWMON_T_CRIT_HYST,
  818. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  819. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  820. HWMON_T_CRIT_HYST,
  821. HWMON_T_INPUT | HWMON_T_ALARM | HWMON_T_MAX |
  822. HWMON_T_MAX_HYST | HWMON_T_TYPE | HWMON_T_CRIT |
  823. HWMON_T_CRIT_HYST),
  824. NULL
  825. };
  826. static const struct hwmon_ops nct7904_hwmon_ops = {
  827. .is_visible = nct7904_is_visible,
  828. .read = nct7904_read,
  829. .write = nct7904_write,
  830. };
  831. static const struct hwmon_chip_info nct7904_chip_info = {
  832. .ops = &nct7904_hwmon_ops,
  833. .info = nct7904_info,
  834. };
  835. /*
  836. * Watchdog Function
  837. */
  838. static int nct7904_wdt_start(struct watchdog_device *wdt)
  839. {
  840. struct nct7904_data *data = watchdog_get_drvdata(wdt);
  841. /* Enable soft watchdog timer */
  842. return nct7904_write_reg(data, BANK_0, WDT_LOCK_REG, WDT_SOFT_EN);
  843. }
  844. static int nct7904_wdt_stop(struct watchdog_device *wdt)
  845. {
  846. struct nct7904_data *data = watchdog_get_drvdata(wdt);
  847. return nct7904_write_reg(data, BANK_0, WDT_LOCK_REG, WDT_SOFT_DIS);
  848. }
  849. static int nct7904_wdt_set_timeout(struct watchdog_device *wdt,
  850. unsigned int timeout)
  851. {
  852. struct nct7904_data *data = watchdog_get_drvdata(wdt);
  853. /*
  854. * The NCT7904 is very special in watchdog function.
  855. * Its minimum unit is minutes. And wdt->timeout needs
  856. * to match the actual timeout selected. So, this needs
  857. * to be: wdt->timeout = timeout / 60 * 60.
  858. * For example, if the user configures a timeout of
  859. * 119 seconds, the actual timeout will be 60 seconds.
  860. * So, wdt->timeout must then be set to 60 seconds.
  861. */
  862. wdt->timeout = timeout / 60 * 60;
  863. return nct7904_write_reg(data, BANK_0, WDT_TIMER_REG,
  864. wdt->timeout / 60);
  865. }
  866. static int nct7904_wdt_ping(struct watchdog_device *wdt)
  867. {
  868. /*
  869. * Note:
  870. * NCT7904 does not support refreshing WDT_TIMER_REG register when
  871. * the watchdog is active. Please disable watchdog before feeding
  872. * the watchdog and enable it again.
  873. */
  874. struct nct7904_data *data = watchdog_get_drvdata(wdt);
  875. int ret;
  876. /* Disable soft watchdog timer */
  877. ret = nct7904_write_reg(data, BANK_0, WDT_LOCK_REG, WDT_SOFT_DIS);
  878. if (ret < 0)
  879. return ret;
  880. /* feed watchdog */
  881. ret = nct7904_write_reg(data, BANK_0, WDT_TIMER_REG, wdt->timeout / 60);
  882. if (ret < 0)
  883. return ret;
  884. /* Enable soft watchdog timer */
  885. return nct7904_write_reg(data, BANK_0, WDT_LOCK_REG, WDT_SOFT_EN);
  886. }
  887. static unsigned int nct7904_wdt_get_timeleft(struct watchdog_device *wdt)
  888. {
  889. struct nct7904_data *data = watchdog_get_drvdata(wdt);
  890. int ret;
  891. ret = nct7904_read_reg(data, BANK_0, WDT_TIMER_REG);
  892. if (ret < 0)
  893. return 0;
  894. return ret * 60;
  895. }
  896. static const struct watchdog_info nct7904_wdt_info = {
  897. .options = WDIOF_SETTIMEOUT | WDIOF_KEEPALIVEPING |
  898. WDIOF_MAGICCLOSE,
  899. .identity = "nct7904 watchdog",
  900. };
  901. static const struct watchdog_ops nct7904_wdt_ops = {
  902. .owner = THIS_MODULE,
  903. .start = nct7904_wdt_start,
  904. .stop = nct7904_wdt_stop,
  905. .ping = nct7904_wdt_ping,
  906. .set_timeout = nct7904_wdt_set_timeout,
  907. .get_timeleft = nct7904_wdt_get_timeleft,
  908. };
  909. static int nct7904_probe(struct i2c_client *client)
  910. {
  911. struct nct7904_data *data;
  912. struct device *hwmon_dev;
  913. struct device *dev = &client->dev;
  914. int ret, i;
  915. u32 mask;
  916. u8 val, bit;
  917. data = devm_kzalloc(dev, sizeof(struct nct7904_data), GFP_KERNEL);
  918. if (!data)
  919. return -ENOMEM;
  920. data->client = client;
  921. data->bank_sel = -1;
  922. /* Setup sensor groups. */
  923. /* FANIN attributes */
  924. ret = nct7904_read_reg16(data, BANK_0, FANIN_CTRL0_REG);
  925. if (ret < 0)
  926. return ret;
  927. data->fanin_mask = (ret >> 8) | ((ret & 0xff) << 8);
  928. /*
  929. * VSEN attributes
  930. *
  931. * Note: voltage sensors overlap with external temperature
  932. * sensors. So, if we ever decide to support the latter
  933. * we will have to adjust 'vsen_mask' accordingly.
  934. */
  935. mask = 0;
  936. ret = nct7904_read_reg16(data, BANK_0, VT_ADC_CTRL0_REG);
  937. if (ret >= 0)
  938. mask = (ret >> 8) | ((ret & 0xff) << 8);
  939. ret = nct7904_read_reg(data, BANK_0, VT_ADC_CTRL2_REG);
  940. if (ret >= 0)
  941. mask |= (ret << 16);
  942. data->vsen_mask = mask;
  943. /* CPU_TEMP attributes */
  944. ret = nct7904_read_reg(data, BANK_0, VT_ADC_CTRL0_REG);
  945. if (ret < 0)
  946. return ret;
  947. if ((ret & 0x6) == 0x6)
  948. data->tcpu_mask |= 1; /* TR1 */
  949. if ((ret & 0x18) == 0x18)
  950. data->tcpu_mask |= 2; /* TR2 */
  951. if ((ret & 0x20) == 0x20)
  952. data->tcpu_mask |= 4; /* TR3 */
  953. if ((ret & 0x80) == 0x80)
  954. data->tcpu_mask |= 8; /* TR4 */
  955. /* LTD */
  956. ret = nct7904_read_reg(data, BANK_0, VT_ADC_CTRL2_REG);
  957. if (ret < 0)
  958. return ret;
  959. if ((ret & 0x02) == 0x02)
  960. data->tcpu_mask |= 0x10;
  961. /* Multi-Function detecting for Volt and TR/TD */
  962. ret = nct7904_read_reg(data, BANK_0, VT_ADC_MD_REG);
  963. if (ret < 0)
  964. return ret;
  965. data->temp_mode = 0;
  966. for (i = 0; i < 4; i++) {
  967. val = (ret >> (i * 2)) & 0x03;
  968. bit = (1 << i);
  969. if (val == VOLT_MONITOR_MODE) {
  970. data->tcpu_mask &= ~bit;
  971. } else if (val == THERMAL_DIODE_MODE && i < 2) {
  972. data->temp_mode |= bit;
  973. data->vsen_mask &= ~(0x06 << (i * 2));
  974. } else if (val == THERMISTOR_MODE) {
  975. data->vsen_mask &= ~(0x02 << (i * 2));
  976. } else {
  977. /* Reserved */
  978. data->tcpu_mask &= ~bit;
  979. data->vsen_mask &= ~(0x06 << (i * 2));
  980. }
  981. }
  982. /* PECI */
  983. ret = nct7904_read_reg(data, BANK_2, PFE_REG);
  984. if (ret < 0)
  985. return ret;
  986. if (ret & 0x80) {
  987. data->enable_dts = 1; /* Enable DTS & PECI */
  988. } else {
  989. ret = nct7904_read_reg(data, BANK_2, TSI_CTRL_REG);
  990. if (ret < 0)
  991. return ret;
  992. if (ret & 0x80)
  993. data->enable_dts = 0x3; /* Enable DTS & TSI */
  994. }
  995. /* Check DTS enable status */
  996. if (data->enable_dts) {
  997. ret = nct7904_read_reg(data, BANK_0, DTS_T_CTRL0_REG);
  998. if (ret < 0)
  999. return ret;
  1000. data->has_dts = ret & 0xF;
  1001. if (data->enable_dts & ENABLE_TSI) {
  1002. ret = nct7904_read_reg(data, BANK_0, DTS_T_CTRL1_REG);
  1003. if (ret < 0)
  1004. return ret;
  1005. data->has_dts |= (ret & 0xF) << 4;
  1006. }
  1007. }
  1008. for (i = 0; i < FANCTL_MAX; i++) {
  1009. ret = nct7904_read_reg(data, BANK_3, FANCTL1_FMR_REG + i);
  1010. if (ret < 0)
  1011. return ret;
  1012. data->fan_mode[i] = ret;
  1013. }
  1014. /* Read all of SMI status register to clear alarms */
  1015. for (i = 0; i < SMI_STS_MAX; i++) {
  1016. ret = nct7904_read_reg(data, BANK_0, SMI_STS1_REG + i);
  1017. if (ret < 0)
  1018. return ret;
  1019. }
  1020. hwmon_dev =
  1021. devm_hwmon_device_register_with_info(dev, client->name, data,
  1022. &nct7904_chip_info, NULL);
  1023. ret = PTR_ERR_OR_ZERO(hwmon_dev);
  1024. if (ret)
  1025. return ret;
  1026. /* Watchdog initialization */
  1027. data->wdt.ops = &nct7904_wdt_ops;
  1028. data->wdt.info = &nct7904_wdt_info;
  1029. data->wdt.timeout = WATCHDOG_TIMEOUT * 60; /* Set default timeout */
  1030. data->wdt.min_timeout = MIN_TIMEOUT;
  1031. data->wdt.max_timeout = MAX_TIMEOUT;
  1032. data->wdt.parent = &client->dev;
  1033. watchdog_init_timeout(&data->wdt, timeout * 60, &client->dev);
  1034. watchdog_set_nowayout(&data->wdt, nowayout);
  1035. watchdog_set_drvdata(&data->wdt, data);
  1036. watchdog_stop_on_unregister(&data->wdt);
  1037. return devm_watchdog_register_device(dev, &data->wdt);
  1038. }
  1039. static const struct i2c_device_id nct7904_id[] = {
  1040. {"nct7904"},
  1041. {}
  1042. };
  1043. MODULE_DEVICE_TABLE(i2c, nct7904_id);
  1044. static struct i2c_driver nct7904_driver = {
  1045. .class = I2C_CLASS_HWMON,
  1046. .driver = {
  1047. .name = "nct7904",
  1048. },
  1049. .probe = nct7904_probe,
  1050. .id_table = nct7904_id,
  1051. .detect = nct7904_detect,
  1052. .address_list = normal_i2c,
  1053. };
  1054. module_i2c_driver(nct7904_driver);
  1055. MODULE_AUTHOR("Vadim V. Vlasov <vvlasov@dev.rtsoft.ru>");
  1056. MODULE_DESCRIPTION("Hwmon driver for NUVOTON NCT7904");
  1057. MODULE_LICENSE("GPL");