sdio.c 23 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069
  1. // SPDX-License-Identifier: GPL-2.0
  2. /*
  3. * Copyright (c) 2012 - 2018 Microchip Technology Inc., and its subsidiaries.
  4. * All rights reserved.
  5. */
  6. #include <linux/clk.h>
  7. #include <linux/mmc/sdio_func.h>
  8. #include <linux/mmc/sdio_ids.h>
  9. #include <linux/mmc/host.h>
  10. #include <linux/mmc/sdio.h>
  11. #include <linux/of_irq.h>
  12. #include "netdev.h"
  13. #include "cfg80211.h"
  14. #define SDIO_MODALIAS "wilc1000_sdio"
  15. static const struct sdio_device_id wilc_sdio_ids[] = {
  16. { SDIO_DEVICE(SDIO_VENDOR_ID_MICROCHIP_WILC, SDIO_DEVICE_ID_MICROCHIP_WILC1000) },
  17. { },
  18. };
  19. MODULE_DEVICE_TABLE(sdio, wilc_sdio_ids);
  20. #define WILC_SDIO_BLOCK_SIZE 512
  21. struct wilc_sdio {
  22. bool irq_gpio;
  23. u32 block_size;
  24. bool isinit;
  25. int has_thrpt_enh3;
  26. u8 *cmd53_buf;
  27. };
  28. struct sdio_cmd52 {
  29. u32 read_write: 1;
  30. u32 function: 3;
  31. u32 raw: 1;
  32. u32 address: 17;
  33. u32 data: 8;
  34. };
  35. struct sdio_cmd53 {
  36. u32 read_write: 1;
  37. u32 function: 3;
  38. u32 block_mode: 1;
  39. u32 increment: 1;
  40. u32 address: 17;
  41. u32 count: 9;
  42. u8 *buffer;
  43. u32 block_size;
  44. bool use_global_buf;
  45. };
  46. static const struct wilc_hif_func wilc_hif_sdio;
  47. static void wilc_sdio_interrupt(struct sdio_func *func)
  48. {
  49. sdio_release_host(func);
  50. wilc_handle_isr(sdio_get_drvdata(func));
  51. sdio_claim_host(func);
  52. }
  53. static int wilc_sdio_cmd52(struct wilc *wilc, struct sdio_cmd52 *cmd)
  54. {
  55. struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
  56. int ret;
  57. u8 data;
  58. sdio_claim_host(func);
  59. func->num = cmd->function;
  60. if (cmd->read_write) { /* write */
  61. if (cmd->raw) {
  62. sdio_writeb(func, cmd->data, cmd->address, &ret);
  63. data = sdio_readb(func, cmd->address, &ret);
  64. cmd->data = data;
  65. } else {
  66. sdio_writeb(func, cmd->data, cmd->address, &ret);
  67. }
  68. } else { /* read */
  69. data = sdio_readb(func, cmd->address, &ret);
  70. cmd->data = data;
  71. }
  72. sdio_release_host(func);
  73. if (ret)
  74. dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
  75. return ret;
  76. }
  77. static int wilc_sdio_cmd53(struct wilc *wilc, struct sdio_cmd53 *cmd)
  78. {
  79. struct sdio_func *func = container_of(wilc->dev, struct sdio_func, dev);
  80. int size, ret;
  81. struct wilc_sdio *sdio_priv = wilc->bus_data;
  82. u8 *buf = cmd->buffer;
  83. sdio_claim_host(func);
  84. func->num = cmd->function;
  85. func->cur_blksize = cmd->block_size;
  86. if (cmd->block_mode)
  87. size = cmd->count * cmd->block_size;
  88. else
  89. size = cmd->count;
  90. if (cmd->use_global_buf) {
  91. if (size > sizeof(u32))
  92. return -EINVAL;
  93. buf = sdio_priv->cmd53_buf;
  94. }
  95. if (cmd->read_write) { /* write */
  96. if (cmd->use_global_buf)
  97. memcpy(buf, cmd->buffer, size);
  98. ret = sdio_memcpy_toio(func, cmd->address, buf, size);
  99. } else { /* read */
  100. ret = sdio_memcpy_fromio(func, buf, cmd->address, size);
  101. if (cmd->use_global_buf)
  102. memcpy(cmd->buffer, buf, size);
  103. }
  104. sdio_release_host(func);
  105. if (ret)
  106. dev_err(&func->dev, "%s..failed, err(%d)\n", __func__, ret);
  107. return ret;
  108. }
  109. static int wilc_sdio_probe(struct sdio_func *func,
  110. const struct sdio_device_id *id)
  111. {
  112. struct wilc *wilc;
  113. int ret;
  114. struct wilc_sdio *sdio_priv;
  115. sdio_priv = kzalloc(sizeof(*sdio_priv), GFP_KERNEL);
  116. if (!sdio_priv)
  117. return -ENOMEM;
  118. sdio_priv->cmd53_buf = kzalloc(sizeof(u32), GFP_KERNEL);
  119. if (!sdio_priv->cmd53_buf) {
  120. ret = -ENOMEM;
  121. goto free;
  122. }
  123. ret = wilc_cfg80211_init(&wilc, &func->dev, WILC_HIF_SDIO,
  124. &wilc_hif_sdio);
  125. if (ret)
  126. goto free;
  127. if (IS_ENABLED(CONFIG_WILC1000_HW_OOB_INTR)) {
  128. struct device_node *np = func->card->dev.of_node;
  129. int irq_num = of_irq_get(np, 0);
  130. if (irq_num > 0) {
  131. wilc->dev_irq_num = irq_num;
  132. sdio_priv->irq_gpio = true;
  133. }
  134. }
  135. sdio_set_drvdata(func, wilc);
  136. wilc->bus_data = sdio_priv;
  137. wilc->dev = &func->dev;
  138. wilc->rtc_clk = devm_clk_get_optional(&func->card->dev, "rtc");
  139. if (IS_ERR(wilc->rtc_clk)) {
  140. ret = PTR_ERR(wilc->rtc_clk);
  141. goto dispose_irq;
  142. }
  143. clk_prepare_enable(wilc->rtc_clk);
  144. dev_info(&func->dev, "Driver Initializing success\n");
  145. return 0;
  146. dispose_irq:
  147. irq_dispose_mapping(wilc->dev_irq_num);
  148. wilc_netdev_cleanup(wilc);
  149. free:
  150. kfree(sdio_priv->cmd53_buf);
  151. kfree(sdio_priv);
  152. return ret;
  153. }
  154. static void wilc_sdio_remove(struct sdio_func *func)
  155. {
  156. struct wilc *wilc = sdio_get_drvdata(func);
  157. struct wilc_sdio *sdio_priv = wilc->bus_data;
  158. clk_disable_unprepare(wilc->rtc_clk);
  159. wilc_netdev_cleanup(wilc);
  160. kfree(sdio_priv->cmd53_buf);
  161. kfree(sdio_priv);
  162. }
  163. static int wilc_sdio_reset(struct wilc *wilc)
  164. {
  165. struct sdio_cmd52 cmd;
  166. int ret;
  167. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  168. cmd.read_write = 1;
  169. cmd.function = 0;
  170. cmd.raw = 0;
  171. cmd.address = SDIO_CCCR_ABORT;
  172. cmd.data = WILC_SDIO_CCCR_ABORT_RESET;
  173. ret = wilc_sdio_cmd52(wilc, &cmd);
  174. if (ret) {
  175. dev_err(&func->dev, "Fail cmd 52, reset cmd ...\n");
  176. return ret;
  177. }
  178. return 0;
  179. }
  180. static bool wilc_sdio_is_init(struct wilc *wilc)
  181. {
  182. struct wilc_sdio *sdio_priv = wilc->bus_data;
  183. return sdio_priv->isinit;
  184. }
  185. static int wilc_sdio_suspend(struct device *dev)
  186. {
  187. struct sdio_func *func = dev_to_sdio_func(dev);
  188. struct wilc *wilc = sdio_get_drvdata(func);
  189. int ret;
  190. dev_info(dev, "sdio suspend\n");
  191. chip_wakeup(wilc);
  192. if (!IS_ERR(wilc->rtc_clk))
  193. clk_disable_unprepare(wilc->rtc_clk);
  194. if (wilc->suspend_event) {
  195. host_sleep_notify(wilc);
  196. chip_allow_sleep(wilc);
  197. }
  198. ret = wilc_sdio_reset(wilc);
  199. if (ret) {
  200. dev_err(&func->dev, "Fail reset sdio\n");
  201. return ret;
  202. }
  203. sdio_claim_host(func);
  204. return 0;
  205. }
  206. static int wilc_sdio_enable_interrupt(struct wilc *dev)
  207. {
  208. struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
  209. int ret = 0;
  210. sdio_claim_host(func);
  211. ret = sdio_claim_irq(func, wilc_sdio_interrupt);
  212. sdio_release_host(func);
  213. if (ret < 0) {
  214. dev_err(&func->dev, "can't claim sdio_irq, err(%d)\n", ret);
  215. ret = -EIO;
  216. }
  217. return ret;
  218. }
  219. static void wilc_sdio_disable_interrupt(struct wilc *dev)
  220. {
  221. struct sdio_func *func = container_of(dev->dev, struct sdio_func, dev);
  222. int ret;
  223. sdio_claim_host(func);
  224. ret = sdio_release_irq(func);
  225. if (ret < 0)
  226. dev_err(&func->dev, "can't release sdio_irq, err(%d)\n", ret);
  227. sdio_release_host(func);
  228. }
  229. /********************************************
  230. *
  231. * Function 0
  232. *
  233. ********************************************/
  234. static int wilc_sdio_set_func0_csa_address(struct wilc *wilc, u32 adr)
  235. {
  236. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  237. struct sdio_cmd52 cmd;
  238. int ret;
  239. /**
  240. * Review: BIG ENDIAN
  241. **/
  242. cmd.read_write = 1;
  243. cmd.function = 0;
  244. cmd.raw = 0;
  245. cmd.address = WILC_SDIO_FBR_CSA_REG;
  246. cmd.data = (u8)adr;
  247. ret = wilc_sdio_cmd52(wilc, &cmd);
  248. if (ret) {
  249. dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
  250. cmd.address);
  251. return ret;
  252. }
  253. cmd.address = WILC_SDIO_FBR_CSA_REG + 1;
  254. cmd.data = (u8)(adr >> 8);
  255. ret = wilc_sdio_cmd52(wilc, &cmd);
  256. if (ret) {
  257. dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
  258. cmd.address);
  259. return ret;
  260. }
  261. cmd.address = WILC_SDIO_FBR_CSA_REG + 2;
  262. cmd.data = (u8)(adr >> 16);
  263. ret = wilc_sdio_cmd52(wilc, &cmd);
  264. if (ret) {
  265. dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
  266. cmd.address);
  267. return ret;
  268. }
  269. return 0;
  270. }
  271. static int wilc_sdio_set_block_size(struct wilc *wilc, u8 func_num,
  272. u32 block_size)
  273. {
  274. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  275. struct sdio_cmd52 cmd;
  276. int ret;
  277. cmd.read_write = 1;
  278. cmd.function = 0;
  279. cmd.raw = 0;
  280. cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE;
  281. cmd.data = (u8)block_size;
  282. ret = wilc_sdio_cmd52(wilc, &cmd);
  283. if (ret) {
  284. dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
  285. cmd.address);
  286. return ret;
  287. }
  288. cmd.address = SDIO_FBR_BASE(func_num) + SDIO_CCCR_BLKSIZE + 1;
  289. cmd.data = (u8)(block_size >> 8);
  290. ret = wilc_sdio_cmd52(wilc, &cmd);
  291. if (ret) {
  292. dev_err(&func->dev, "Failed cmd52, set %04x data...\n",
  293. cmd.address);
  294. return ret;
  295. }
  296. return 0;
  297. }
  298. /********************************************
  299. *
  300. * Sdio interfaces
  301. *
  302. ********************************************/
  303. static int wilc_sdio_write_reg(struct wilc *wilc, u32 addr, u32 data)
  304. {
  305. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  306. struct wilc_sdio *sdio_priv = wilc->bus_data;
  307. int ret;
  308. cpu_to_le32s(&data);
  309. if (addr >= 0xf0 && addr <= 0xff) { /* only vendor specific registers */
  310. struct sdio_cmd52 cmd;
  311. cmd.read_write = 1;
  312. cmd.function = 0;
  313. cmd.raw = 0;
  314. cmd.address = addr;
  315. cmd.data = data;
  316. ret = wilc_sdio_cmd52(wilc, &cmd);
  317. if (ret)
  318. dev_err(&func->dev,
  319. "Failed cmd 52, read reg (%08x) ...\n", addr);
  320. } else {
  321. struct sdio_cmd53 cmd;
  322. /**
  323. * set the AHB address
  324. **/
  325. ret = wilc_sdio_set_func0_csa_address(wilc, addr);
  326. if (ret)
  327. return ret;
  328. cmd.read_write = 1;
  329. cmd.function = 0;
  330. cmd.address = WILC_SDIO_FBR_DATA_REG;
  331. cmd.block_mode = 0;
  332. cmd.increment = 1;
  333. cmd.count = sizeof(u32);
  334. cmd.buffer = (u8 *)&data;
  335. cmd.use_global_buf = true;
  336. cmd.block_size = sdio_priv->block_size;
  337. ret = wilc_sdio_cmd53(wilc, &cmd);
  338. if (ret)
  339. dev_err(&func->dev,
  340. "Failed cmd53, write reg (%08x)...\n", addr);
  341. }
  342. return ret;
  343. }
  344. static int wilc_sdio_write(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
  345. {
  346. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  347. struct wilc_sdio *sdio_priv = wilc->bus_data;
  348. u32 block_size = sdio_priv->block_size;
  349. struct sdio_cmd53 cmd;
  350. int nblk, nleft, ret;
  351. cmd.read_write = 1;
  352. if (addr > 0) {
  353. /**
  354. * func 0 access
  355. **/
  356. cmd.function = 0;
  357. cmd.address = WILC_SDIO_FBR_DATA_REG;
  358. } else {
  359. /**
  360. * func 1 access
  361. **/
  362. cmd.function = 1;
  363. cmd.address = WILC_SDIO_F1_DATA_REG;
  364. }
  365. size = ALIGN(size, 4);
  366. nblk = size / block_size;
  367. nleft = size % block_size;
  368. cmd.use_global_buf = false;
  369. if (nblk > 0) {
  370. cmd.block_mode = 1;
  371. cmd.increment = 1;
  372. cmd.count = nblk;
  373. cmd.buffer = buf;
  374. cmd.block_size = block_size;
  375. if (addr > 0) {
  376. ret = wilc_sdio_set_func0_csa_address(wilc, addr);
  377. if (ret)
  378. return ret;
  379. }
  380. ret = wilc_sdio_cmd53(wilc, &cmd);
  381. if (ret) {
  382. dev_err(&func->dev,
  383. "Failed cmd53 [%x], block send...\n", addr);
  384. return ret;
  385. }
  386. if (addr > 0)
  387. addr += nblk * block_size;
  388. buf += nblk * block_size;
  389. }
  390. if (nleft > 0) {
  391. cmd.block_mode = 0;
  392. cmd.increment = 1;
  393. cmd.count = nleft;
  394. cmd.buffer = buf;
  395. cmd.block_size = block_size;
  396. if (addr > 0) {
  397. ret = wilc_sdio_set_func0_csa_address(wilc, addr);
  398. if (ret)
  399. return ret;
  400. }
  401. ret = wilc_sdio_cmd53(wilc, &cmd);
  402. if (ret) {
  403. dev_err(&func->dev,
  404. "Failed cmd53 [%x], bytes send...\n", addr);
  405. return ret;
  406. }
  407. }
  408. return 0;
  409. }
  410. static int wilc_sdio_read_reg(struct wilc *wilc, u32 addr, u32 *data)
  411. {
  412. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  413. struct wilc_sdio *sdio_priv = wilc->bus_data;
  414. int ret;
  415. if (addr >= 0xf0 && addr <= 0xff) { /* only vendor specific registers */
  416. struct sdio_cmd52 cmd;
  417. cmd.read_write = 0;
  418. cmd.function = 0;
  419. cmd.raw = 0;
  420. cmd.address = addr;
  421. ret = wilc_sdio_cmd52(wilc, &cmd);
  422. if (ret) {
  423. dev_err(&func->dev,
  424. "Failed cmd 52, read reg (%08x) ...\n", addr);
  425. return ret;
  426. }
  427. *data = cmd.data;
  428. } else {
  429. struct sdio_cmd53 cmd;
  430. ret = wilc_sdio_set_func0_csa_address(wilc, addr);
  431. if (ret)
  432. return ret;
  433. cmd.read_write = 0;
  434. cmd.function = 0;
  435. cmd.address = WILC_SDIO_FBR_DATA_REG;
  436. cmd.block_mode = 0;
  437. cmd.increment = 1;
  438. cmd.count = sizeof(u32);
  439. cmd.buffer = (u8 *)data;
  440. cmd.use_global_buf = true;
  441. cmd.block_size = sdio_priv->block_size;
  442. ret = wilc_sdio_cmd53(wilc, &cmd);
  443. if (ret) {
  444. dev_err(&func->dev,
  445. "Failed cmd53, read reg (%08x)...\n", addr);
  446. return ret;
  447. }
  448. }
  449. le32_to_cpus(data);
  450. return 0;
  451. }
  452. static int wilc_sdio_read(struct wilc *wilc, u32 addr, u8 *buf, u32 size)
  453. {
  454. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  455. struct wilc_sdio *sdio_priv = wilc->bus_data;
  456. u32 block_size = sdio_priv->block_size;
  457. struct sdio_cmd53 cmd;
  458. int nblk, nleft, ret;
  459. cmd.read_write = 0;
  460. if (addr > 0) {
  461. /**
  462. * func 0 access
  463. **/
  464. cmd.function = 0;
  465. cmd.address = WILC_SDIO_FBR_DATA_REG;
  466. } else {
  467. /**
  468. * func 1 access
  469. **/
  470. cmd.function = 1;
  471. cmd.address = WILC_SDIO_F1_DATA_REG;
  472. }
  473. size = ALIGN(size, 4);
  474. nblk = size / block_size;
  475. nleft = size % block_size;
  476. cmd.use_global_buf = false;
  477. if (nblk > 0) {
  478. cmd.block_mode = 1;
  479. cmd.increment = 1;
  480. cmd.count = nblk;
  481. cmd.buffer = buf;
  482. cmd.block_size = block_size;
  483. if (addr > 0) {
  484. ret = wilc_sdio_set_func0_csa_address(wilc, addr);
  485. if (ret)
  486. return ret;
  487. }
  488. ret = wilc_sdio_cmd53(wilc, &cmd);
  489. if (ret) {
  490. dev_err(&func->dev,
  491. "Failed cmd53 [%x], block read...\n", addr);
  492. return ret;
  493. }
  494. if (addr > 0)
  495. addr += nblk * block_size;
  496. buf += nblk * block_size;
  497. } /* if (nblk > 0) */
  498. if (nleft > 0) {
  499. cmd.block_mode = 0;
  500. cmd.increment = 1;
  501. cmd.count = nleft;
  502. cmd.buffer = buf;
  503. cmd.block_size = block_size;
  504. if (addr > 0) {
  505. ret = wilc_sdio_set_func0_csa_address(wilc, addr);
  506. if (ret)
  507. return ret;
  508. }
  509. ret = wilc_sdio_cmd53(wilc, &cmd);
  510. if (ret) {
  511. dev_err(&func->dev,
  512. "Failed cmd53 [%x], bytes read...\n", addr);
  513. return ret;
  514. }
  515. }
  516. return 0;
  517. }
  518. /********************************************
  519. *
  520. * Bus interfaces
  521. *
  522. ********************************************/
  523. static int wilc_sdio_deinit(struct wilc *wilc)
  524. {
  525. struct wilc_sdio *sdio_priv = wilc->bus_data;
  526. sdio_priv->isinit = false;
  527. return 0;
  528. }
  529. static int wilc_sdio_init(struct wilc *wilc, bool resume)
  530. {
  531. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  532. struct wilc_sdio *sdio_priv = wilc->bus_data;
  533. struct sdio_cmd52 cmd;
  534. int loop, ret;
  535. u32 chipid;
  536. /**
  537. * function 0 csa enable
  538. **/
  539. cmd.read_write = 1;
  540. cmd.function = 0;
  541. cmd.raw = 1;
  542. cmd.address = SDIO_FBR_BASE(1);
  543. cmd.data = SDIO_FBR_ENABLE_CSA;
  544. ret = wilc_sdio_cmd52(wilc, &cmd);
  545. if (ret) {
  546. dev_err(&func->dev, "Fail cmd 52, enable csa...\n");
  547. return ret;
  548. }
  549. /**
  550. * function 0 block size
  551. **/
  552. ret = wilc_sdio_set_block_size(wilc, 0, WILC_SDIO_BLOCK_SIZE);
  553. if (ret) {
  554. dev_err(&func->dev, "Fail cmd 52, set func 0 block size...\n");
  555. return ret;
  556. }
  557. sdio_priv->block_size = WILC_SDIO_BLOCK_SIZE;
  558. /**
  559. * enable func1 IO
  560. **/
  561. cmd.read_write = 1;
  562. cmd.function = 0;
  563. cmd.raw = 1;
  564. cmd.address = SDIO_CCCR_IOEx;
  565. cmd.data = WILC_SDIO_CCCR_IO_EN_FUNC1;
  566. ret = wilc_sdio_cmd52(wilc, &cmd);
  567. if (ret) {
  568. dev_err(&func->dev,
  569. "Fail cmd 52, set IOE register...\n");
  570. return ret;
  571. }
  572. /**
  573. * make sure func 1 is up
  574. **/
  575. cmd.read_write = 0;
  576. cmd.function = 0;
  577. cmd.raw = 0;
  578. cmd.address = SDIO_CCCR_IORx;
  579. loop = 3;
  580. do {
  581. cmd.data = 0;
  582. ret = wilc_sdio_cmd52(wilc, &cmd);
  583. if (ret) {
  584. dev_err(&func->dev,
  585. "Fail cmd 52, get IOR register...\n");
  586. return ret;
  587. }
  588. if (cmd.data == WILC_SDIO_CCCR_IO_EN_FUNC1)
  589. break;
  590. } while (loop--);
  591. if (loop <= 0) {
  592. dev_err(&func->dev, "Fail func 1 is not ready...\n");
  593. return -EINVAL;
  594. }
  595. /**
  596. * func 1 is ready, set func 1 block size
  597. **/
  598. ret = wilc_sdio_set_block_size(wilc, 1, WILC_SDIO_BLOCK_SIZE);
  599. if (ret) {
  600. dev_err(&func->dev, "Fail set func 1 block size...\n");
  601. return ret;
  602. }
  603. /**
  604. * func 1 interrupt enable
  605. **/
  606. cmd.read_write = 1;
  607. cmd.function = 0;
  608. cmd.raw = 1;
  609. cmd.address = SDIO_CCCR_IENx;
  610. cmd.data = WILC_SDIO_CCCR_IEN_MASTER | WILC_SDIO_CCCR_IEN_FUNC1;
  611. ret = wilc_sdio_cmd52(wilc, &cmd);
  612. if (ret) {
  613. dev_err(&func->dev, "Fail cmd 52, set IEN register...\n");
  614. return ret;
  615. }
  616. /**
  617. * make sure can read back chip id correctly
  618. **/
  619. if (!resume) {
  620. int rev;
  621. ret = wilc_sdio_read_reg(wilc, WILC_CHIPID, &chipid);
  622. if (ret) {
  623. dev_err(&func->dev, "Fail cmd read chip id...\n");
  624. return ret;
  625. }
  626. dev_err(&func->dev, "chipid (%08x)\n", chipid);
  627. rev = FIELD_GET(WILC_CHIP_REV_FIELD, chipid);
  628. if (rev > FIELD_GET(WILC_CHIP_REV_FIELD, WILC_1000_BASE_ID_2A))
  629. sdio_priv->has_thrpt_enh3 = 1;
  630. else
  631. sdio_priv->has_thrpt_enh3 = 0;
  632. dev_info(&func->dev, "has_thrpt_enh3 = %d...\n",
  633. sdio_priv->has_thrpt_enh3);
  634. }
  635. sdio_priv->isinit = true;
  636. return 0;
  637. }
  638. static int wilc_sdio_read_size(struct wilc *wilc, u32 *size)
  639. {
  640. u32 tmp;
  641. struct sdio_cmd52 cmd;
  642. /**
  643. * Read DMA count in words
  644. **/
  645. cmd.read_write = 0;
  646. cmd.function = 0;
  647. cmd.raw = 0;
  648. cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG;
  649. cmd.data = 0;
  650. wilc_sdio_cmd52(wilc, &cmd);
  651. tmp = cmd.data;
  652. cmd.address = WILC_SDIO_INTERRUPT_DATA_SZ_REG + 1;
  653. cmd.data = 0;
  654. wilc_sdio_cmd52(wilc, &cmd);
  655. tmp |= (cmd.data << 8);
  656. *size = tmp;
  657. return 0;
  658. }
  659. static int wilc_sdio_read_int(struct wilc *wilc, u32 *int_status)
  660. {
  661. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  662. struct wilc_sdio *sdio_priv = wilc->bus_data;
  663. u32 tmp;
  664. u8 irq_flags;
  665. struct sdio_cmd52 cmd;
  666. wilc_sdio_read_size(wilc, &tmp);
  667. /**
  668. * Read IRQ flags
  669. **/
  670. if (!sdio_priv->irq_gpio) {
  671. cmd.function = 1;
  672. cmd.address = WILC_SDIO_EXT_IRQ_FLAG_REG;
  673. } else {
  674. cmd.function = 0;
  675. cmd.address = WILC_SDIO_IRQ_FLAG_REG;
  676. }
  677. cmd.raw = 0;
  678. cmd.read_write = 0;
  679. cmd.data = 0;
  680. wilc_sdio_cmd52(wilc, &cmd);
  681. irq_flags = cmd.data;
  682. tmp |= FIELD_PREP(IRG_FLAGS_MASK, cmd.data);
  683. if (FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags))
  684. dev_err(&func->dev, "Unexpected interrupt (1) int=%lx\n",
  685. FIELD_GET(UNHANDLED_IRQ_MASK, irq_flags));
  686. *int_status = tmp;
  687. return 0;
  688. }
  689. static int wilc_sdio_clear_int_ext(struct wilc *wilc, u32 val)
  690. {
  691. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  692. struct wilc_sdio *sdio_priv = wilc->bus_data;
  693. int ret;
  694. int vmm_ctl;
  695. if (sdio_priv->has_thrpt_enh3) {
  696. u32 reg = 0;
  697. if (sdio_priv->irq_gpio)
  698. reg = val & (BIT(MAX_NUM_INT) - 1);
  699. /* select VMM table 0 */
  700. if (val & SEL_VMM_TBL0)
  701. reg |= BIT(5);
  702. /* select VMM table 1 */
  703. if (val & SEL_VMM_TBL1)
  704. reg |= BIT(6);
  705. /* enable VMM */
  706. if (val & EN_VMM)
  707. reg |= BIT(7);
  708. if (reg) {
  709. struct sdio_cmd52 cmd;
  710. cmd.read_write = 1;
  711. cmd.function = 0;
  712. cmd.raw = 0;
  713. cmd.address = WILC_SDIO_IRQ_CLEAR_FLAG_REG;
  714. cmd.data = reg;
  715. ret = wilc_sdio_cmd52(wilc, &cmd);
  716. if (ret) {
  717. dev_err(&func->dev,
  718. "Failed cmd52, set (%02x) data (%d) ...\n",
  719. cmd.address, __LINE__);
  720. return ret;
  721. }
  722. }
  723. return 0;
  724. }
  725. if (sdio_priv->irq_gpio) {
  726. /* has_thrpt_enh2 uses register 0xf8 to clear interrupts. */
  727. /*
  728. * Cannot clear multiple interrupts.
  729. * Must clear each interrupt individually.
  730. */
  731. u32 flags;
  732. int i;
  733. flags = val & (BIT(MAX_NUM_INT) - 1);
  734. for (i = 0; i < NUM_INT_EXT && flags; i++) {
  735. if (flags & BIT(i)) {
  736. struct sdio_cmd52 cmd;
  737. cmd.read_write = 1;
  738. cmd.function = 0;
  739. cmd.raw = 0;
  740. cmd.address = WILC_SDIO_IRQ_CLEAR_FLAG_REG;
  741. cmd.data = BIT(i);
  742. ret = wilc_sdio_cmd52(wilc, &cmd);
  743. if (ret) {
  744. dev_err(&func->dev,
  745. "Failed cmd52, set (%02x) data (%d) ...\n",
  746. cmd.address, __LINE__);
  747. return ret;
  748. }
  749. flags &= ~BIT(i);
  750. }
  751. }
  752. for (i = NUM_INT_EXT; i < MAX_NUM_INT && flags; i++) {
  753. if (flags & BIT(i)) {
  754. dev_err(&func->dev,
  755. "Unexpected interrupt cleared %d...\n",
  756. i);
  757. flags &= ~BIT(i);
  758. }
  759. }
  760. }
  761. vmm_ctl = 0;
  762. /* select VMM table 0 */
  763. if (val & SEL_VMM_TBL0)
  764. vmm_ctl |= BIT(0);
  765. /* select VMM table 1 */
  766. if (val & SEL_VMM_TBL1)
  767. vmm_ctl |= BIT(1);
  768. /* enable VMM */
  769. if (val & EN_VMM)
  770. vmm_ctl |= BIT(2);
  771. if (vmm_ctl) {
  772. struct sdio_cmd52 cmd;
  773. cmd.read_write = 1;
  774. cmd.function = 0;
  775. cmd.raw = 0;
  776. cmd.address = WILC_SDIO_VMM_TBL_CTRL_REG;
  777. cmd.data = vmm_ctl;
  778. ret = wilc_sdio_cmd52(wilc, &cmd);
  779. if (ret) {
  780. dev_err(&func->dev,
  781. "Failed cmd52, set (%02x) data (%d) ...\n",
  782. cmd.address, __LINE__);
  783. return ret;
  784. }
  785. }
  786. return 0;
  787. }
  788. static int wilc_sdio_sync_ext(struct wilc *wilc, int nint)
  789. {
  790. struct sdio_func *func = dev_to_sdio_func(wilc->dev);
  791. struct wilc_sdio *sdio_priv = wilc->bus_data;
  792. u32 reg;
  793. if (nint > MAX_NUM_INT) {
  794. dev_err(&func->dev, "Too many interrupts (%d)...\n", nint);
  795. return -EINVAL;
  796. }
  797. /**
  798. * Disable power sequencer
  799. **/
  800. if (wilc_sdio_read_reg(wilc, WILC_MISC, &reg)) {
  801. dev_err(&func->dev, "Failed read misc reg...\n");
  802. return -EINVAL;
  803. }
  804. reg &= ~BIT(8);
  805. if (wilc_sdio_write_reg(wilc, WILC_MISC, reg)) {
  806. dev_err(&func->dev, "Failed write misc reg...\n");
  807. return -EINVAL;
  808. }
  809. if (sdio_priv->irq_gpio) {
  810. u32 reg;
  811. int ret, i;
  812. /**
  813. * interrupt pin mux select
  814. **/
  815. ret = wilc_sdio_read_reg(wilc, WILC_PIN_MUX_0, &reg);
  816. if (ret) {
  817. dev_err(&func->dev, "Failed read reg (%08x)...\n",
  818. WILC_PIN_MUX_0);
  819. return ret;
  820. }
  821. reg |= BIT(8);
  822. ret = wilc_sdio_write_reg(wilc, WILC_PIN_MUX_0, reg);
  823. if (ret) {
  824. dev_err(&func->dev, "Failed write reg (%08x)...\n",
  825. WILC_PIN_MUX_0);
  826. return ret;
  827. }
  828. /**
  829. * interrupt enable
  830. **/
  831. ret = wilc_sdio_read_reg(wilc, WILC_INTR_ENABLE, &reg);
  832. if (ret) {
  833. dev_err(&func->dev, "Failed read reg (%08x)...\n",
  834. WILC_INTR_ENABLE);
  835. return ret;
  836. }
  837. for (i = 0; (i < 5) && (nint > 0); i++, nint--)
  838. reg |= BIT((27 + i));
  839. ret = wilc_sdio_write_reg(wilc, WILC_INTR_ENABLE, reg);
  840. if (ret) {
  841. dev_err(&func->dev, "Failed write reg (%08x)...\n",
  842. WILC_INTR_ENABLE);
  843. return ret;
  844. }
  845. if (nint) {
  846. ret = wilc_sdio_read_reg(wilc, WILC_INTR2_ENABLE, &reg);
  847. if (ret) {
  848. dev_err(&func->dev,
  849. "Failed read reg (%08x)...\n",
  850. WILC_INTR2_ENABLE);
  851. return ret;
  852. }
  853. for (i = 0; (i < 3) && (nint > 0); i++, nint--)
  854. reg |= BIT(i);
  855. ret = wilc_sdio_write_reg(wilc, WILC_INTR2_ENABLE, reg);
  856. if (ret) {
  857. dev_err(&func->dev,
  858. "Failed write reg (%08x)...\n",
  859. WILC_INTR2_ENABLE);
  860. return ret;
  861. }
  862. }
  863. }
  864. return 0;
  865. }
  866. /* Global sdio HIF function table */
  867. static const struct wilc_hif_func wilc_hif_sdio = {
  868. .hif_init = wilc_sdio_init,
  869. .hif_deinit = wilc_sdio_deinit,
  870. .hif_read_reg = wilc_sdio_read_reg,
  871. .hif_write_reg = wilc_sdio_write_reg,
  872. .hif_block_rx = wilc_sdio_read,
  873. .hif_block_tx = wilc_sdio_write,
  874. .hif_read_int = wilc_sdio_read_int,
  875. .hif_clear_int_ext = wilc_sdio_clear_int_ext,
  876. .hif_read_size = wilc_sdio_read_size,
  877. .hif_block_tx_ext = wilc_sdio_write,
  878. .hif_block_rx_ext = wilc_sdio_read,
  879. .hif_sync_ext = wilc_sdio_sync_ext,
  880. .enable_interrupt = wilc_sdio_enable_interrupt,
  881. .disable_interrupt = wilc_sdio_disable_interrupt,
  882. .hif_reset = wilc_sdio_reset,
  883. .hif_is_init = wilc_sdio_is_init,
  884. };
  885. static int wilc_sdio_resume(struct device *dev)
  886. {
  887. struct sdio_func *func = dev_to_sdio_func(dev);
  888. struct wilc *wilc = sdio_get_drvdata(func);
  889. dev_info(dev, "sdio resume\n");
  890. sdio_release_host(func);
  891. chip_wakeup(wilc);
  892. wilc_sdio_init(wilc, true);
  893. if (wilc->suspend_event)
  894. host_wakeup_notify(wilc);
  895. chip_allow_sleep(wilc);
  896. return 0;
  897. }
  898. static const struct of_device_id wilc_of_match[] = {
  899. { .compatible = "microchip,wilc1000", },
  900. { /* sentinel */ }
  901. };
  902. MODULE_DEVICE_TABLE(of, wilc_of_match);
  903. static const struct dev_pm_ops wilc_sdio_pm_ops = {
  904. .suspend = wilc_sdio_suspend,
  905. .resume = wilc_sdio_resume,
  906. };
  907. static struct sdio_driver wilc_sdio_driver = {
  908. .name = SDIO_MODALIAS,
  909. .id_table = wilc_sdio_ids,
  910. .probe = wilc_sdio_probe,
  911. .remove = wilc_sdio_remove,
  912. .drv = {
  913. .pm = &wilc_sdio_pm_ops,
  914. .of_match_table = wilc_of_match,
  915. }
  916. };
  917. module_driver(wilc_sdio_driver,
  918. sdio_register_driver,
  919. sdio_unregister_driver);
  920. MODULE_LICENSE("GPL");