pfunc_core.c 25 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021
  1. /*
  2. *
  3. * FIXME: Properly make this race free with refcounting etc...
  4. *
  5. * FIXME: LOCKING !!!
  6. */
  7. #include <linux/delay.h>
  8. #include <linux/kernel.h>
  9. #include <linux/spinlock.h>
  10. #include <linux/slab.h>
  11. #include <linux/module.h>
  12. #include <linux/mutex.h>
  13. #include <asm/prom.h>
  14. #include <asm/pmac_pfunc.h>
  15. /* Debug */
  16. #define LOG_PARSE(fmt...)
  17. #define LOG_ERROR(fmt...) printk(fmt)
  18. #define LOG_BLOB(t,b,c)
  19. #undef DEBUG
  20. #ifdef DEBUG
  21. #define DBG(fmt...) printk(fmt)
  22. #else
  23. #define DBG(fmt...)
  24. #endif
  25. /* Command numbers */
  26. #define PMF_CMD_LIST 0
  27. #define PMF_CMD_WRITE_GPIO 1
  28. #define PMF_CMD_READ_GPIO 2
  29. #define PMF_CMD_WRITE_REG32 3
  30. #define PMF_CMD_READ_REG32 4
  31. #define PMF_CMD_WRITE_REG16 5
  32. #define PMF_CMD_READ_REG16 6
  33. #define PMF_CMD_WRITE_REG8 7
  34. #define PMF_CMD_READ_REG8 8
  35. #define PMF_CMD_DELAY 9
  36. #define PMF_CMD_WAIT_REG32 10
  37. #define PMF_CMD_WAIT_REG16 11
  38. #define PMF_CMD_WAIT_REG8 12
  39. #define PMF_CMD_READ_I2C 13
  40. #define PMF_CMD_WRITE_I2C 14
  41. #define PMF_CMD_RMW_I2C 15
  42. #define PMF_CMD_GEN_I2C 16
  43. #define PMF_CMD_SHIFT_BYTES_RIGHT 17
  44. #define PMF_CMD_SHIFT_BYTES_LEFT 18
  45. #define PMF_CMD_READ_CFG 19
  46. #define PMF_CMD_WRITE_CFG 20
  47. #define PMF_CMD_RMW_CFG 21
  48. #define PMF_CMD_READ_I2C_SUBADDR 22
  49. #define PMF_CMD_WRITE_I2C_SUBADDR 23
  50. #define PMF_CMD_SET_I2C_MODE 24
  51. #define PMF_CMD_RMW_I2C_SUBADDR 25
  52. #define PMF_CMD_READ_REG32_MASK_SHR_XOR 26
  53. #define PMF_CMD_READ_REG16_MASK_SHR_XOR 27
  54. #define PMF_CMD_READ_REG8_MASK_SHR_XOR 28
  55. #define PMF_CMD_WRITE_REG32_SHL_MASK 29
  56. #define PMF_CMD_WRITE_REG16_SHL_MASK 30
  57. #define PMF_CMD_WRITE_REG8_SHL_MASK 31
  58. #define PMF_CMD_MASK_AND_COMPARE 32
  59. #define PMF_CMD_COUNT 33
  60. /* This structure holds the state of the parser while walking through
  61. * a function definition
  62. */
  63. struct pmf_cmd {
  64. const void *cmdptr;
  65. const void *cmdend;
  66. struct pmf_function *func;
  67. void *instdata;
  68. struct pmf_args *args;
  69. int error;
  70. };
  71. #if 0
  72. /* Debug output */
  73. static void print_blob(const char *title, const void *blob, int bytes)
  74. {
  75. printk("%s", title);
  76. while(bytes--) {
  77. printk("%02x ", *((u8 *)blob));
  78. blob += 1;
  79. }
  80. printk("\n");
  81. }
  82. #endif
  83. /*
  84. * Parser helpers
  85. */
  86. static u32 pmf_next32(struct pmf_cmd *cmd)
  87. {
  88. u32 value;
  89. if ((cmd->cmdend - cmd->cmdptr) < 4) {
  90. cmd->error = 1;
  91. return 0;
  92. }
  93. value = *((u32 *)cmd->cmdptr);
  94. cmd->cmdptr += 4;
  95. return value;
  96. }
  97. static const void* pmf_next_blob(struct pmf_cmd *cmd, int count)
  98. {
  99. const void *value;
  100. if ((cmd->cmdend - cmd->cmdptr) < count) {
  101. cmd->error = 1;
  102. return NULL;
  103. }
  104. value = cmd->cmdptr;
  105. cmd->cmdptr += count;
  106. return value;
  107. }
  108. /*
  109. * Individual command parsers
  110. */
  111. #define PMF_PARSE_CALL(name, cmd, handlers, p...) \
  112. do { \
  113. if (cmd->error) \
  114. return -ENXIO; \
  115. if (handlers == NULL) \
  116. return 0; \
  117. if (handlers->name) \
  118. return handlers->name(cmd->func, cmd->instdata, \
  119. cmd->args, p); \
  120. return -1; \
  121. } while(0) \
  122. static int pmf_parser_write_gpio(struct pmf_cmd *cmd, struct pmf_handlers *h)
  123. {
  124. u8 value = (u8)pmf_next32(cmd);
  125. u8 mask = (u8)pmf_next32(cmd);
  126. LOG_PARSE("pmf: write_gpio(value: %02x, mask: %02x)\n", value, mask);
  127. PMF_PARSE_CALL(write_gpio, cmd, h, value, mask);
  128. }
  129. static int pmf_parser_read_gpio(struct pmf_cmd *cmd, struct pmf_handlers *h)
  130. {
  131. u8 mask = (u8)pmf_next32(cmd);
  132. int rshift = (int)pmf_next32(cmd);
  133. u8 xor = (u8)pmf_next32(cmd);
  134. LOG_PARSE("pmf: read_gpio(mask: %02x, rshift: %d, xor: %02x)\n",
  135. mask, rshift, xor);
  136. PMF_PARSE_CALL(read_gpio, cmd, h, mask, rshift, xor);
  137. }
  138. static int pmf_parser_write_reg32(struct pmf_cmd *cmd, struct pmf_handlers *h)
  139. {
  140. u32 offset = pmf_next32(cmd);
  141. u32 value = pmf_next32(cmd);
  142. u32 mask = pmf_next32(cmd);
  143. LOG_PARSE("pmf: write_reg32(offset: %08x, value: %08x, mask: %08x)\n",
  144. offset, value, mask);
  145. PMF_PARSE_CALL(write_reg32, cmd, h, offset, value, mask);
  146. }
  147. static int pmf_parser_read_reg32(struct pmf_cmd *cmd, struct pmf_handlers *h)
  148. {
  149. u32 offset = pmf_next32(cmd);
  150. LOG_PARSE("pmf: read_reg32(offset: %08x)\n", offset);
  151. PMF_PARSE_CALL(read_reg32, cmd, h, offset);
  152. }
  153. static int pmf_parser_write_reg16(struct pmf_cmd *cmd, struct pmf_handlers *h)
  154. {
  155. u32 offset = pmf_next32(cmd);
  156. u16 value = (u16)pmf_next32(cmd);
  157. u16 mask = (u16)pmf_next32(cmd);
  158. LOG_PARSE("pmf: write_reg16(offset: %08x, value: %04x, mask: %04x)\n",
  159. offset, value, mask);
  160. PMF_PARSE_CALL(write_reg16, cmd, h, offset, value, mask);
  161. }
  162. static int pmf_parser_read_reg16(struct pmf_cmd *cmd, struct pmf_handlers *h)
  163. {
  164. u32 offset = pmf_next32(cmd);
  165. LOG_PARSE("pmf: read_reg16(offset: %08x)\n", offset);
  166. PMF_PARSE_CALL(read_reg16, cmd, h, offset);
  167. }
  168. static int pmf_parser_write_reg8(struct pmf_cmd *cmd, struct pmf_handlers *h)
  169. {
  170. u32 offset = pmf_next32(cmd);
  171. u8 value = (u16)pmf_next32(cmd);
  172. u8 mask = (u16)pmf_next32(cmd);
  173. LOG_PARSE("pmf: write_reg8(offset: %08x, value: %02x, mask: %02x)\n",
  174. offset, value, mask);
  175. PMF_PARSE_CALL(write_reg8, cmd, h, offset, value, mask);
  176. }
  177. static int pmf_parser_read_reg8(struct pmf_cmd *cmd, struct pmf_handlers *h)
  178. {
  179. u32 offset = pmf_next32(cmd);
  180. LOG_PARSE("pmf: read_reg8(offset: %08x)\n", offset);
  181. PMF_PARSE_CALL(read_reg8, cmd, h, offset);
  182. }
  183. static int pmf_parser_delay(struct pmf_cmd *cmd, struct pmf_handlers *h)
  184. {
  185. u32 duration = pmf_next32(cmd);
  186. LOG_PARSE("pmf: delay(duration: %d us)\n", duration);
  187. PMF_PARSE_CALL(delay, cmd, h, duration);
  188. }
  189. static int pmf_parser_wait_reg32(struct pmf_cmd *cmd, struct pmf_handlers *h)
  190. {
  191. u32 offset = pmf_next32(cmd);
  192. u32 value = pmf_next32(cmd);
  193. u32 mask = pmf_next32(cmd);
  194. LOG_PARSE("pmf: wait_reg32(offset: %08x, comp_value: %08x,mask: %08x)\n",
  195. offset, value, mask);
  196. PMF_PARSE_CALL(wait_reg32, cmd, h, offset, value, mask);
  197. }
  198. static int pmf_parser_wait_reg16(struct pmf_cmd *cmd, struct pmf_handlers *h)
  199. {
  200. u32 offset = pmf_next32(cmd);
  201. u16 value = (u16)pmf_next32(cmd);
  202. u16 mask = (u16)pmf_next32(cmd);
  203. LOG_PARSE("pmf: wait_reg16(offset: %08x, comp_value: %04x,mask: %04x)\n",
  204. offset, value, mask);
  205. PMF_PARSE_CALL(wait_reg16, cmd, h, offset, value, mask);
  206. }
  207. static int pmf_parser_wait_reg8(struct pmf_cmd *cmd, struct pmf_handlers *h)
  208. {
  209. u32 offset = pmf_next32(cmd);
  210. u8 value = (u8)pmf_next32(cmd);
  211. u8 mask = (u8)pmf_next32(cmd);
  212. LOG_PARSE("pmf: wait_reg8(offset: %08x, comp_value: %02x,mask: %02x)\n",
  213. offset, value, mask);
  214. PMF_PARSE_CALL(wait_reg8, cmd, h, offset, value, mask);
  215. }
  216. static int pmf_parser_read_i2c(struct pmf_cmd *cmd, struct pmf_handlers *h)
  217. {
  218. u32 bytes = pmf_next32(cmd);
  219. LOG_PARSE("pmf: read_i2c(bytes: %ud)\n", bytes);
  220. PMF_PARSE_CALL(read_i2c, cmd, h, bytes);
  221. }
  222. static int pmf_parser_write_i2c(struct pmf_cmd *cmd, struct pmf_handlers *h)
  223. {
  224. u32 bytes = pmf_next32(cmd);
  225. const void *blob = pmf_next_blob(cmd, bytes);
  226. LOG_PARSE("pmf: write_i2c(bytes: %ud) ...\n", bytes);
  227. LOG_BLOB("pmf: data: \n", blob, bytes);
  228. PMF_PARSE_CALL(write_i2c, cmd, h, bytes, blob);
  229. }
  230. static int pmf_parser_rmw_i2c(struct pmf_cmd *cmd, struct pmf_handlers *h)
  231. {
  232. u32 maskbytes = pmf_next32(cmd);
  233. u32 valuesbytes = pmf_next32(cmd);
  234. u32 totalbytes = pmf_next32(cmd);
  235. const void *maskblob = pmf_next_blob(cmd, maskbytes);
  236. const void *valuesblob = pmf_next_blob(cmd, valuesbytes);
  237. LOG_PARSE("pmf: rmw_i2c(maskbytes: %ud, valuebytes: %ud, "
  238. "totalbytes: %d) ...\n",
  239. maskbytes, valuesbytes, totalbytes);
  240. LOG_BLOB("pmf: mask data: \n", maskblob, maskbytes);
  241. LOG_BLOB("pmf: values data: \n", valuesblob, valuesbytes);
  242. PMF_PARSE_CALL(rmw_i2c, cmd, h, maskbytes, valuesbytes, totalbytes,
  243. maskblob, valuesblob);
  244. }
  245. static int pmf_parser_read_cfg(struct pmf_cmd *cmd, struct pmf_handlers *h)
  246. {
  247. u32 offset = pmf_next32(cmd);
  248. u32 bytes = pmf_next32(cmd);
  249. LOG_PARSE("pmf: read_cfg(offset: %x, bytes: %ud)\n", offset, bytes);
  250. PMF_PARSE_CALL(read_cfg, cmd, h, offset, bytes);
  251. }
  252. static int pmf_parser_write_cfg(struct pmf_cmd *cmd, struct pmf_handlers *h)
  253. {
  254. u32 offset = pmf_next32(cmd);
  255. u32 bytes = pmf_next32(cmd);
  256. const void *blob = pmf_next_blob(cmd, bytes);
  257. LOG_PARSE("pmf: write_cfg(offset: %x, bytes: %ud)\n", offset, bytes);
  258. LOG_BLOB("pmf: data: \n", blob, bytes);
  259. PMF_PARSE_CALL(write_cfg, cmd, h, offset, bytes, blob);
  260. }
  261. static int pmf_parser_rmw_cfg(struct pmf_cmd *cmd, struct pmf_handlers *h)
  262. {
  263. u32 offset = pmf_next32(cmd);
  264. u32 maskbytes = pmf_next32(cmd);
  265. u32 valuesbytes = pmf_next32(cmd);
  266. u32 totalbytes = pmf_next32(cmd);
  267. const void *maskblob = pmf_next_blob(cmd, maskbytes);
  268. const void *valuesblob = pmf_next_blob(cmd, valuesbytes);
  269. LOG_PARSE("pmf: rmw_cfg(maskbytes: %ud, valuebytes: %ud,"
  270. " totalbytes: %d) ...\n",
  271. maskbytes, valuesbytes, totalbytes);
  272. LOG_BLOB("pmf: mask data: \n", maskblob, maskbytes);
  273. LOG_BLOB("pmf: values data: \n", valuesblob, valuesbytes);
  274. PMF_PARSE_CALL(rmw_cfg, cmd, h, offset, maskbytes, valuesbytes,
  275. totalbytes, maskblob, valuesblob);
  276. }
  277. static int pmf_parser_read_i2c_sub(struct pmf_cmd *cmd, struct pmf_handlers *h)
  278. {
  279. u8 subaddr = (u8)pmf_next32(cmd);
  280. u32 bytes = pmf_next32(cmd);
  281. LOG_PARSE("pmf: read_i2c_sub(subaddr: %x, bytes: %ud)\n",
  282. subaddr, bytes);
  283. PMF_PARSE_CALL(read_i2c_sub, cmd, h, subaddr, bytes);
  284. }
  285. static int pmf_parser_write_i2c_sub(struct pmf_cmd *cmd, struct pmf_handlers *h)
  286. {
  287. u8 subaddr = (u8)pmf_next32(cmd);
  288. u32 bytes = pmf_next32(cmd);
  289. const void *blob = pmf_next_blob(cmd, bytes);
  290. LOG_PARSE("pmf: write_i2c_sub(subaddr: %x, bytes: %ud) ...\n",
  291. subaddr, bytes);
  292. LOG_BLOB("pmf: data: \n", blob, bytes);
  293. PMF_PARSE_CALL(write_i2c_sub, cmd, h, subaddr, bytes, blob);
  294. }
  295. static int pmf_parser_set_i2c_mode(struct pmf_cmd *cmd, struct pmf_handlers *h)
  296. {
  297. u32 mode = pmf_next32(cmd);
  298. LOG_PARSE("pmf: set_i2c_mode(mode: %d)\n", mode);
  299. PMF_PARSE_CALL(set_i2c_mode, cmd, h, mode);
  300. }
  301. static int pmf_parser_rmw_i2c_sub(struct pmf_cmd *cmd, struct pmf_handlers *h)
  302. {
  303. u8 subaddr = (u8)pmf_next32(cmd);
  304. u32 maskbytes = pmf_next32(cmd);
  305. u32 valuesbytes = pmf_next32(cmd);
  306. u32 totalbytes = pmf_next32(cmd);
  307. const void *maskblob = pmf_next_blob(cmd, maskbytes);
  308. const void *valuesblob = pmf_next_blob(cmd, valuesbytes);
  309. LOG_PARSE("pmf: rmw_i2c_sub(subaddr: %x, maskbytes: %ud, valuebytes: %ud"
  310. ", totalbytes: %d) ...\n",
  311. subaddr, maskbytes, valuesbytes, totalbytes);
  312. LOG_BLOB("pmf: mask data: \n", maskblob, maskbytes);
  313. LOG_BLOB("pmf: values data: \n", valuesblob, valuesbytes);
  314. PMF_PARSE_CALL(rmw_i2c_sub, cmd, h, subaddr, maskbytes, valuesbytes,
  315. totalbytes, maskblob, valuesblob);
  316. }
  317. static int pmf_parser_read_reg32_msrx(struct pmf_cmd *cmd,
  318. struct pmf_handlers *h)
  319. {
  320. u32 offset = pmf_next32(cmd);
  321. u32 mask = pmf_next32(cmd);
  322. u32 shift = pmf_next32(cmd);
  323. u32 xor = pmf_next32(cmd);
  324. LOG_PARSE("pmf: read_reg32_msrx(offset: %x, mask: %x, shift: %x,"
  325. " xor: %x\n", offset, mask, shift, xor);
  326. PMF_PARSE_CALL(read_reg32_msrx, cmd, h, offset, mask, shift, xor);
  327. }
  328. static int pmf_parser_read_reg16_msrx(struct pmf_cmd *cmd,
  329. struct pmf_handlers *h)
  330. {
  331. u32 offset = pmf_next32(cmd);
  332. u32 mask = pmf_next32(cmd);
  333. u32 shift = pmf_next32(cmd);
  334. u32 xor = pmf_next32(cmd);
  335. LOG_PARSE("pmf: read_reg16_msrx(offset: %x, mask: %x, shift: %x,"
  336. " xor: %x\n", offset, mask, shift, xor);
  337. PMF_PARSE_CALL(read_reg16_msrx, cmd, h, offset, mask, shift, xor);
  338. }
  339. static int pmf_parser_read_reg8_msrx(struct pmf_cmd *cmd,
  340. struct pmf_handlers *h)
  341. {
  342. u32 offset = pmf_next32(cmd);
  343. u32 mask = pmf_next32(cmd);
  344. u32 shift = pmf_next32(cmd);
  345. u32 xor = pmf_next32(cmd);
  346. LOG_PARSE("pmf: read_reg8_msrx(offset: %x, mask: %x, shift: %x,"
  347. " xor: %x\n", offset, mask, shift, xor);
  348. PMF_PARSE_CALL(read_reg8_msrx, cmd, h, offset, mask, shift, xor);
  349. }
  350. static int pmf_parser_write_reg32_slm(struct pmf_cmd *cmd,
  351. struct pmf_handlers *h)
  352. {
  353. u32 offset = pmf_next32(cmd);
  354. u32 shift = pmf_next32(cmd);
  355. u32 mask = pmf_next32(cmd);
  356. LOG_PARSE("pmf: write_reg32_slm(offset: %x, shift: %x, mask: %x\n",
  357. offset, shift, mask);
  358. PMF_PARSE_CALL(write_reg32_slm, cmd, h, offset, shift, mask);
  359. }
  360. static int pmf_parser_write_reg16_slm(struct pmf_cmd *cmd,
  361. struct pmf_handlers *h)
  362. {
  363. u32 offset = pmf_next32(cmd);
  364. u32 shift = pmf_next32(cmd);
  365. u32 mask = pmf_next32(cmd);
  366. LOG_PARSE("pmf: write_reg16_slm(offset: %x, shift: %x, mask: %x\n",
  367. offset, shift, mask);
  368. PMF_PARSE_CALL(write_reg16_slm, cmd, h, offset, shift, mask);
  369. }
  370. static int pmf_parser_write_reg8_slm(struct pmf_cmd *cmd,
  371. struct pmf_handlers *h)
  372. {
  373. u32 offset = pmf_next32(cmd);
  374. u32 shift = pmf_next32(cmd);
  375. u32 mask = pmf_next32(cmd);
  376. LOG_PARSE("pmf: write_reg8_slm(offset: %x, shift: %x, mask: %x\n",
  377. offset, shift, mask);
  378. PMF_PARSE_CALL(write_reg8_slm, cmd, h, offset, shift, mask);
  379. }
  380. static int pmf_parser_mask_and_compare(struct pmf_cmd *cmd,
  381. struct pmf_handlers *h)
  382. {
  383. u32 bytes = pmf_next32(cmd);
  384. const void *maskblob = pmf_next_blob(cmd, bytes);
  385. const void *valuesblob = pmf_next_blob(cmd, bytes);
  386. LOG_PARSE("pmf: mask_and_compare(length: %ud ...\n", bytes);
  387. LOG_BLOB("pmf: mask data: \n", maskblob, bytes);
  388. LOG_BLOB("pmf: values data: \n", valuesblob, bytes);
  389. PMF_PARSE_CALL(mask_and_compare, cmd, h,
  390. bytes, maskblob, valuesblob);
  391. }
  392. typedef int (*pmf_cmd_parser_t)(struct pmf_cmd *cmd, struct pmf_handlers *h);
  393. static pmf_cmd_parser_t pmf_parsers[PMF_CMD_COUNT] =
  394. {
  395. NULL,
  396. pmf_parser_write_gpio,
  397. pmf_parser_read_gpio,
  398. pmf_parser_write_reg32,
  399. pmf_parser_read_reg32,
  400. pmf_parser_write_reg16,
  401. pmf_parser_read_reg16,
  402. pmf_parser_write_reg8,
  403. pmf_parser_read_reg8,
  404. pmf_parser_delay,
  405. pmf_parser_wait_reg32,
  406. pmf_parser_wait_reg16,
  407. pmf_parser_wait_reg8,
  408. pmf_parser_read_i2c,
  409. pmf_parser_write_i2c,
  410. pmf_parser_rmw_i2c,
  411. NULL, /* Bogus command */
  412. NULL, /* Shift bytes right: NYI */
  413. NULL, /* Shift bytes left: NYI */
  414. pmf_parser_read_cfg,
  415. pmf_parser_write_cfg,
  416. pmf_parser_rmw_cfg,
  417. pmf_parser_read_i2c_sub,
  418. pmf_parser_write_i2c_sub,
  419. pmf_parser_set_i2c_mode,
  420. pmf_parser_rmw_i2c_sub,
  421. pmf_parser_read_reg32_msrx,
  422. pmf_parser_read_reg16_msrx,
  423. pmf_parser_read_reg8_msrx,
  424. pmf_parser_write_reg32_slm,
  425. pmf_parser_write_reg16_slm,
  426. pmf_parser_write_reg8_slm,
  427. pmf_parser_mask_and_compare,
  428. };
  429. struct pmf_device {
  430. struct list_head link;
  431. struct device_node *node;
  432. struct pmf_handlers *handlers;
  433. struct list_head functions;
  434. struct kref ref;
  435. };
  436. static LIST_HEAD(pmf_devices);
  437. static DEFINE_SPINLOCK(pmf_lock);
  438. static DEFINE_MUTEX(pmf_irq_mutex);
  439. static void pmf_release_device(struct kref *kref)
  440. {
  441. struct pmf_device *dev = container_of(kref, struct pmf_device, ref);
  442. kfree(dev);
  443. }
  444. static inline void pmf_put_device(struct pmf_device *dev)
  445. {
  446. kref_put(&dev->ref, pmf_release_device);
  447. }
  448. static inline struct pmf_device *pmf_get_device(struct pmf_device *dev)
  449. {
  450. kref_get(&dev->ref);
  451. return dev;
  452. }
  453. static inline struct pmf_device *pmf_find_device(struct device_node *np)
  454. {
  455. struct pmf_device *dev;
  456. list_for_each_entry(dev, &pmf_devices, link) {
  457. if (dev->node == np)
  458. return pmf_get_device(dev);
  459. }
  460. return NULL;
  461. }
  462. static int pmf_parse_one(struct pmf_function *func,
  463. struct pmf_handlers *handlers,
  464. void *instdata, struct pmf_args *args)
  465. {
  466. struct pmf_cmd cmd;
  467. u32 ccode;
  468. int count, rc;
  469. cmd.cmdptr = func->data;
  470. cmd.cmdend = func->data + func->length;
  471. cmd.func = func;
  472. cmd.instdata = instdata;
  473. cmd.args = args;
  474. cmd.error = 0;
  475. LOG_PARSE("pmf: func %s, %d bytes, %s...\n",
  476. func->name, func->length,
  477. handlers ? "executing" : "parsing");
  478. /* One subcommand to parse for now */
  479. count = 1;
  480. while(count-- && cmd.cmdptr < cmd.cmdend) {
  481. /* Get opcode */
  482. ccode = pmf_next32(&cmd);
  483. /* Check if we are hitting a command list, fetch new count */
  484. if (ccode == 0) {
  485. count = pmf_next32(&cmd) - 1;
  486. ccode = pmf_next32(&cmd);
  487. }
  488. if (cmd.error) {
  489. LOG_ERROR("pmf: parse error, not enough data\n");
  490. return -ENXIO;
  491. }
  492. if (ccode >= PMF_CMD_COUNT) {
  493. LOG_ERROR("pmf: command code %d unknown !\n", ccode);
  494. return -ENXIO;
  495. }
  496. if (pmf_parsers[ccode] == NULL) {
  497. LOG_ERROR("pmf: no parser for command %d !\n", ccode);
  498. return -ENXIO;
  499. }
  500. rc = pmf_parsers[ccode](&cmd, handlers);
  501. if (rc != 0) {
  502. LOG_ERROR("pmf: parser for command %d returned"
  503. " error %d\n", ccode, rc);
  504. return rc;
  505. }
  506. }
  507. /* We are doing an initial parse pass, we need to adjust the size */
  508. if (handlers == NULL)
  509. func->length = cmd.cmdptr - func->data;
  510. return 0;
  511. }
  512. static int pmf_add_function_prop(struct pmf_device *dev, void *driverdata,
  513. const char *name, u32 *data,
  514. unsigned int length)
  515. {
  516. int count = 0;
  517. struct pmf_function *func = NULL;
  518. DBG("pmf: Adding functions for platform-do-%s\n", name);
  519. while (length >= 12) {
  520. /* Allocate a structure */
  521. func = kzalloc(sizeof(struct pmf_function), GFP_KERNEL);
  522. if (func == NULL)
  523. goto bail;
  524. kref_init(&func->ref);
  525. INIT_LIST_HEAD(&func->irq_clients);
  526. func->node = dev->node;
  527. func->driver_data = driverdata;
  528. func->name = name;
  529. func->phandle = data[0];
  530. func->flags = data[1];
  531. data += 2;
  532. length -= 8;
  533. func->data = data;
  534. func->length = length;
  535. func->dev = dev;
  536. DBG("pmf: idx %d: flags=%08x, phandle=%08x "
  537. " %d bytes remaining, parsing...\n",
  538. count+1, func->flags, func->phandle, length);
  539. if (pmf_parse_one(func, NULL, NULL, NULL)) {
  540. kfree(func);
  541. goto bail;
  542. }
  543. length -= func->length;
  544. data = (u32 *)(((u8 *)data) + func->length);
  545. list_add(&func->link, &dev->functions);
  546. pmf_get_device(dev);
  547. count++;
  548. }
  549. bail:
  550. DBG("pmf: Added %d functions\n", count);
  551. return count;
  552. }
  553. static int pmf_add_functions(struct pmf_device *dev, void *driverdata)
  554. {
  555. struct property *pp;
  556. #define PP_PREFIX "platform-do-"
  557. const int plen = strlen(PP_PREFIX);
  558. int count = 0;
  559. for (pp = dev->node->properties; pp != 0; pp = pp->next) {
  560. const char *name;
  561. if (strncmp(pp->name, PP_PREFIX, plen) != 0)
  562. continue;
  563. name = pp->name + plen;
  564. if (strlen(name) && pp->length >= 12)
  565. count += pmf_add_function_prop(dev, driverdata, name,
  566. pp->value, pp->length);
  567. }
  568. return count;
  569. }
  570. int pmf_register_driver(struct device_node *np,
  571. struct pmf_handlers *handlers,
  572. void *driverdata)
  573. {
  574. struct pmf_device *dev;
  575. unsigned long flags;
  576. int rc = 0;
  577. if (handlers == NULL)
  578. return -EINVAL;
  579. DBG("pmf: registering driver for node %s\n", np->full_name);
  580. spin_lock_irqsave(&pmf_lock, flags);
  581. dev = pmf_find_device(np);
  582. spin_unlock_irqrestore(&pmf_lock, flags);
  583. if (dev != NULL) {
  584. DBG("pmf: already there !\n");
  585. pmf_put_device(dev);
  586. return -EBUSY;
  587. }
  588. dev = kzalloc(sizeof(struct pmf_device), GFP_KERNEL);
  589. if (dev == NULL) {
  590. DBG("pmf: no memory !\n");
  591. return -ENOMEM;
  592. }
  593. kref_init(&dev->ref);
  594. dev->node = of_node_get(np);
  595. dev->handlers = handlers;
  596. INIT_LIST_HEAD(&dev->functions);
  597. rc = pmf_add_functions(dev, driverdata);
  598. if (rc == 0) {
  599. DBG("pmf: no functions, disposing.. \n");
  600. of_node_put(np);
  601. kfree(dev);
  602. return -ENODEV;
  603. }
  604. spin_lock_irqsave(&pmf_lock, flags);
  605. list_add(&dev->link, &pmf_devices);
  606. spin_unlock_irqrestore(&pmf_lock, flags);
  607. return 0;
  608. }
  609. EXPORT_SYMBOL_GPL(pmf_register_driver);
  610. struct pmf_function *pmf_get_function(struct pmf_function *func)
  611. {
  612. if (!try_module_get(func->dev->handlers->owner))
  613. return NULL;
  614. kref_get(&func->ref);
  615. return func;
  616. }
  617. EXPORT_SYMBOL_GPL(pmf_get_function);
  618. static void pmf_release_function(struct kref *kref)
  619. {
  620. struct pmf_function *func =
  621. container_of(kref, struct pmf_function, ref);
  622. pmf_put_device(func->dev);
  623. kfree(func);
  624. }
  625. static inline void __pmf_put_function(struct pmf_function *func)
  626. {
  627. kref_put(&func->ref, pmf_release_function);
  628. }
  629. void pmf_put_function(struct pmf_function *func)
  630. {
  631. if (func == NULL)
  632. return;
  633. module_put(func->dev->handlers->owner);
  634. __pmf_put_function(func);
  635. }
  636. EXPORT_SYMBOL_GPL(pmf_put_function);
  637. void pmf_unregister_driver(struct device_node *np)
  638. {
  639. struct pmf_device *dev;
  640. unsigned long flags;
  641. DBG("pmf: unregistering driver for node %s\n", np->full_name);
  642. spin_lock_irqsave(&pmf_lock, flags);
  643. dev = pmf_find_device(np);
  644. if (dev == NULL) {
  645. DBG("pmf: not such driver !\n");
  646. spin_unlock_irqrestore(&pmf_lock, flags);
  647. return;
  648. }
  649. list_del(&dev->link);
  650. while(!list_empty(&dev->functions)) {
  651. struct pmf_function *func =
  652. list_entry(dev->functions.next, typeof(*func), link);
  653. list_del(&func->link);
  654. __pmf_put_function(func);
  655. }
  656. pmf_put_device(dev);
  657. spin_unlock_irqrestore(&pmf_lock, flags);
  658. }
  659. EXPORT_SYMBOL_GPL(pmf_unregister_driver);
  660. struct pmf_function *__pmf_find_function(struct device_node *target,
  661. const char *name, u32 flags)
  662. {
  663. struct device_node *actor = of_node_get(target);
  664. struct pmf_device *dev;
  665. struct pmf_function *func, *result = NULL;
  666. char fname[64];
  667. const u32 *prop;
  668. u32 ph;
  669. /*
  670. * Look for a "platform-*" function reference. If we can't find
  671. * one, then we fallback to a direct call attempt
  672. */
  673. snprintf(fname, 63, "platform-%s", name);
  674. prop = of_get_property(target, fname, NULL);
  675. if (prop == NULL)
  676. goto find_it;
  677. ph = *prop;
  678. if (ph == 0)
  679. goto find_it;
  680. /*
  681. * Ok, now try to find the actor. If we can't find it, we fail,
  682. * there is no point in falling back there
  683. */
  684. of_node_put(actor);
  685. actor = of_find_node_by_phandle(ph);
  686. if (actor == NULL)
  687. return NULL;
  688. find_it:
  689. dev = pmf_find_device(actor);
  690. if (dev == NULL) {
  691. result = NULL;
  692. goto out;
  693. }
  694. list_for_each_entry(func, &dev->functions, link) {
  695. if (name && strcmp(name, func->name))
  696. continue;
  697. if (func->phandle && target->phandle != func->phandle)
  698. continue;
  699. if ((func->flags & flags) == 0)
  700. continue;
  701. result = func;
  702. break;
  703. }
  704. pmf_put_device(dev);
  705. out:
  706. of_node_put(actor);
  707. return result;
  708. }
  709. int pmf_register_irq_client(struct device_node *target,
  710. const char *name,
  711. struct pmf_irq_client *client)
  712. {
  713. struct pmf_function *func;
  714. unsigned long flags;
  715. spin_lock_irqsave(&pmf_lock, flags);
  716. func = __pmf_find_function(target, name, PMF_FLAGS_INT_GEN);
  717. if (func)
  718. func = pmf_get_function(func);
  719. spin_unlock_irqrestore(&pmf_lock, flags);
  720. if (func == NULL)
  721. return -ENODEV;
  722. /* guard against manipulations of list */
  723. mutex_lock(&pmf_irq_mutex);
  724. if (list_empty(&func->irq_clients))
  725. func->dev->handlers->irq_enable(func);
  726. /* guard against pmf_do_irq while changing list */
  727. spin_lock_irqsave(&pmf_lock, flags);
  728. list_add(&client->link, &func->irq_clients);
  729. spin_unlock_irqrestore(&pmf_lock, flags);
  730. client->func = func;
  731. mutex_unlock(&pmf_irq_mutex);
  732. return 0;
  733. }
  734. EXPORT_SYMBOL_GPL(pmf_register_irq_client);
  735. void pmf_unregister_irq_client(struct pmf_irq_client *client)
  736. {
  737. struct pmf_function *func = client->func;
  738. unsigned long flags;
  739. BUG_ON(func == NULL);
  740. /* guard against manipulations of list */
  741. mutex_lock(&pmf_irq_mutex);
  742. client->func = NULL;
  743. /* guard against pmf_do_irq while changing list */
  744. spin_lock_irqsave(&pmf_lock, flags);
  745. list_del(&client->link);
  746. spin_unlock_irqrestore(&pmf_lock, flags);
  747. if (list_empty(&func->irq_clients))
  748. func->dev->handlers->irq_disable(func);
  749. mutex_unlock(&pmf_irq_mutex);
  750. pmf_put_function(func);
  751. }
  752. EXPORT_SYMBOL_GPL(pmf_unregister_irq_client);
  753. void pmf_do_irq(struct pmf_function *func)
  754. {
  755. unsigned long flags;
  756. struct pmf_irq_client *client;
  757. /* For now, using a spinlock over the whole function. Can be made
  758. * to drop the lock using 2 lists if necessary
  759. */
  760. spin_lock_irqsave(&pmf_lock, flags);
  761. list_for_each_entry(client, &func->irq_clients, link) {
  762. if (!try_module_get(client->owner))
  763. continue;
  764. client->handler(client->data);
  765. module_put(client->owner);
  766. }
  767. spin_unlock_irqrestore(&pmf_lock, flags);
  768. }
  769. EXPORT_SYMBOL_GPL(pmf_do_irq);
  770. int pmf_call_one(struct pmf_function *func, struct pmf_args *args)
  771. {
  772. struct pmf_device *dev = func->dev;
  773. void *instdata = NULL;
  774. int rc = 0;
  775. DBG(" ** pmf_call_one(%s/%s) **\n", dev->node->full_name, func->name);
  776. if (dev->handlers->begin)
  777. instdata = dev->handlers->begin(func, args);
  778. rc = pmf_parse_one(func, dev->handlers, instdata, args);
  779. if (dev->handlers->end)
  780. dev->handlers->end(func, instdata);
  781. return rc;
  782. }
  783. EXPORT_SYMBOL_GPL(pmf_call_one);
  784. int pmf_do_functions(struct device_node *np, const char *name,
  785. u32 phandle, u32 fflags, struct pmf_args *args)
  786. {
  787. struct pmf_device *dev;
  788. struct pmf_function *func, *tmp;
  789. unsigned long flags;
  790. int rc = -ENODEV;
  791. spin_lock_irqsave(&pmf_lock, flags);
  792. dev = pmf_find_device(np);
  793. if (dev == NULL) {
  794. spin_unlock_irqrestore(&pmf_lock, flags);
  795. return -ENODEV;
  796. }
  797. list_for_each_entry_safe(func, tmp, &dev->functions, link) {
  798. if (name && strcmp(name, func->name))
  799. continue;
  800. if (phandle && func->phandle && phandle != func->phandle)
  801. continue;
  802. if ((func->flags & fflags) == 0)
  803. continue;
  804. if (pmf_get_function(func) == NULL)
  805. continue;
  806. spin_unlock_irqrestore(&pmf_lock, flags);
  807. rc = pmf_call_one(func, args);
  808. pmf_put_function(func);
  809. spin_lock_irqsave(&pmf_lock, flags);
  810. }
  811. pmf_put_device(dev);
  812. spin_unlock_irqrestore(&pmf_lock, flags);
  813. return rc;
  814. }
  815. EXPORT_SYMBOL_GPL(pmf_do_functions);
  816. struct pmf_function *pmf_find_function(struct device_node *target,
  817. const char *name)
  818. {
  819. struct pmf_function *func;
  820. unsigned long flags;
  821. spin_lock_irqsave(&pmf_lock, flags);
  822. func = __pmf_find_function(target, name, PMF_FLAGS_ON_DEMAND);
  823. if (func)
  824. func = pmf_get_function(func);
  825. spin_unlock_irqrestore(&pmf_lock, flags);
  826. return func;
  827. }
  828. EXPORT_SYMBOL_GPL(pmf_find_function);
  829. int pmf_call_function(struct device_node *target, const char *name,
  830. struct pmf_args *args)
  831. {
  832. struct pmf_function *func = pmf_find_function(target, name);
  833. int rc;
  834. if (func == NULL)
  835. return -ENODEV;
  836. rc = pmf_call_one(func, args);
  837. pmf_put_function(func);
  838. return rc;
  839. }
  840. EXPORT_SYMBOL_GPL(pmf_call_function);