pwm.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339
  1. /*
  2. * PWM Greybus driver.
  3. *
  4. * Copyright 2014 Google Inc.
  5. * Copyright 2014 Linaro Ltd.
  6. *
  7. * Released under the GPLv2 only.
  8. */
  9. #include <linux/kernel.h>
  10. #include <linux/module.h>
  11. #include <linux/slab.h>
  12. #include <linux/pwm.h>
  13. #include "greybus.h"
  14. #include "gbphy.h"
  15. struct gb_pwm_chip {
  16. struct gb_connection *connection;
  17. u8 pwm_max; /* max pwm number */
  18. struct pwm_chip chip;
  19. struct pwm_chip *pwm;
  20. };
  21. #define pwm_chip_to_gb_pwm_chip(chip) \
  22. container_of(chip, struct gb_pwm_chip, chip)
  23. static int gb_pwm_count_operation(struct gb_pwm_chip *pwmc)
  24. {
  25. struct gb_pwm_count_response response;
  26. int ret;
  27. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_PWM_COUNT,
  28. NULL, 0, &response, sizeof(response));
  29. if (ret)
  30. return ret;
  31. pwmc->pwm_max = response.count;
  32. return 0;
  33. }
  34. static int gb_pwm_activate_operation(struct gb_pwm_chip *pwmc,
  35. u8 which)
  36. {
  37. struct gb_pwm_activate_request request;
  38. struct gbphy_device *gbphy_dev;
  39. int ret;
  40. if (which > pwmc->pwm_max)
  41. return -EINVAL;
  42. request.which = which;
  43. gbphy_dev = to_gbphy_dev(pwmc->chip.dev);
  44. ret = gbphy_runtime_get_sync(gbphy_dev);
  45. if (ret)
  46. return ret;
  47. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_ACTIVATE,
  48. &request, sizeof(request), NULL, 0);
  49. gbphy_runtime_put_autosuspend(gbphy_dev);
  50. return ret;
  51. }
  52. static int gb_pwm_deactivate_operation(struct gb_pwm_chip *pwmc,
  53. u8 which)
  54. {
  55. struct gb_pwm_deactivate_request request;
  56. struct gbphy_device *gbphy_dev;
  57. int ret;
  58. if (which > pwmc->pwm_max)
  59. return -EINVAL;
  60. request.which = which;
  61. gbphy_dev = to_gbphy_dev(pwmc->chip.dev);
  62. ret = gbphy_runtime_get_sync(gbphy_dev);
  63. if (ret)
  64. return ret;
  65. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_DEACTIVATE,
  66. &request, sizeof(request), NULL, 0);
  67. gbphy_runtime_put_autosuspend(gbphy_dev);
  68. return ret;
  69. }
  70. static int gb_pwm_config_operation(struct gb_pwm_chip *pwmc,
  71. u8 which, u32 duty, u32 period)
  72. {
  73. struct gb_pwm_config_request request;
  74. struct gbphy_device *gbphy_dev;
  75. int ret;
  76. if (which > pwmc->pwm_max)
  77. return -EINVAL;
  78. request.which = which;
  79. request.duty = cpu_to_le32(duty);
  80. request.period = cpu_to_le32(period);
  81. gbphy_dev = to_gbphy_dev(pwmc->chip.dev);
  82. ret = gbphy_runtime_get_sync(gbphy_dev);
  83. if (ret)
  84. return ret;
  85. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_CONFIG,
  86. &request, sizeof(request), NULL, 0);
  87. gbphy_runtime_put_autosuspend(gbphy_dev);
  88. return ret;
  89. }
  90. static int gb_pwm_set_polarity_operation(struct gb_pwm_chip *pwmc,
  91. u8 which, u8 polarity)
  92. {
  93. struct gb_pwm_polarity_request request;
  94. struct gbphy_device *gbphy_dev;
  95. int ret;
  96. if (which > pwmc->pwm_max)
  97. return -EINVAL;
  98. request.which = which;
  99. request.polarity = polarity;
  100. gbphy_dev = to_gbphy_dev(pwmc->chip.dev);
  101. ret = gbphy_runtime_get_sync(gbphy_dev);
  102. if (ret)
  103. return ret;
  104. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_POLARITY,
  105. &request, sizeof(request), NULL, 0);
  106. gbphy_runtime_put_autosuspend(gbphy_dev);
  107. return ret;
  108. }
  109. static int gb_pwm_enable_operation(struct gb_pwm_chip *pwmc,
  110. u8 which)
  111. {
  112. struct gb_pwm_enable_request request;
  113. struct gbphy_device *gbphy_dev;
  114. int ret;
  115. if (which > pwmc->pwm_max)
  116. return -EINVAL;
  117. request.which = which;
  118. gbphy_dev = to_gbphy_dev(pwmc->chip.dev);
  119. ret = gbphy_runtime_get_sync(gbphy_dev);
  120. if (ret)
  121. return ret;
  122. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_ENABLE,
  123. &request, sizeof(request), NULL, 0);
  124. if (ret)
  125. gbphy_runtime_put_autosuspend(gbphy_dev);
  126. return ret;
  127. }
  128. static int gb_pwm_disable_operation(struct gb_pwm_chip *pwmc,
  129. u8 which)
  130. {
  131. struct gb_pwm_disable_request request;
  132. struct gbphy_device *gbphy_dev;
  133. int ret;
  134. if (which > pwmc->pwm_max)
  135. return -EINVAL;
  136. request.which = which;
  137. ret = gb_operation_sync(pwmc->connection, GB_PWM_TYPE_DISABLE,
  138. &request, sizeof(request), NULL, 0);
  139. gbphy_dev = to_gbphy_dev(pwmc->chip.dev);
  140. gbphy_runtime_put_autosuspend(gbphy_dev);
  141. return ret;
  142. }
  143. static int gb_pwm_request(struct pwm_chip *chip, struct pwm_device *pwm)
  144. {
  145. struct gb_pwm_chip *pwmc = pwm_chip_to_gb_pwm_chip(chip);
  146. return gb_pwm_activate_operation(pwmc, pwm->hwpwm);
  147. };
  148. static void gb_pwm_free(struct pwm_chip *chip, struct pwm_device *pwm)
  149. {
  150. struct gb_pwm_chip *pwmc = pwm_chip_to_gb_pwm_chip(chip);
  151. if (pwm_is_enabled(pwm))
  152. dev_warn(chip->dev, "freeing PWM device without disabling\n");
  153. gb_pwm_deactivate_operation(pwmc, pwm->hwpwm);
  154. }
  155. static int gb_pwm_config(struct pwm_chip *chip, struct pwm_device *pwm,
  156. int duty_ns, int period_ns)
  157. {
  158. struct gb_pwm_chip *pwmc = pwm_chip_to_gb_pwm_chip(chip);
  159. return gb_pwm_config_operation(pwmc, pwm->hwpwm, duty_ns, period_ns);
  160. };
  161. static int gb_pwm_set_polarity(struct pwm_chip *chip, struct pwm_device *pwm,
  162. enum pwm_polarity polarity)
  163. {
  164. struct gb_pwm_chip *pwmc = pwm_chip_to_gb_pwm_chip(chip);
  165. return gb_pwm_set_polarity_operation(pwmc, pwm->hwpwm, polarity);
  166. };
  167. static int gb_pwm_enable(struct pwm_chip *chip, struct pwm_device *pwm)
  168. {
  169. struct gb_pwm_chip *pwmc = pwm_chip_to_gb_pwm_chip(chip);
  170. return gb_pwm_enable_operation(pwmc, pwm->hwpwm);
  171. };
  172. static void gb_pwm_disable(struct pwm_chip *chip, struct pwm_device *pwm)
  173. {
  174. struct gb_pwm_chip *pwmc = pwm_chip_to_gb_pwm_chip(chip);
  175. gb_pwm_disable_operation(pwmc, pwm->hwpwm);
  176. };
  177. static const struct pwm_ops gb_pwm_ops = {
  178. .request = gb_pwm_request,
  179. .free = gb_pwm_free,
  180. .config = gb_pwm_config,
  181. .set_polarity = gb_pwm_set_polarity,
  182. .enable = gb_pwm_enable,
  183. .disable = gb_pwm_disable,
  184. .owner = THIS_MODULE,
  185. };
  186. static int gb_pwm_probe(struct gbphy_device *gbphy_dev,
  187. const struct gbphy_device_id *id)
  188. {
  189. struct gb_connection *connection;
  190. struct gb_pwm_chip *pwmc;
  191. struct pwm_chip *pwm;
  192. int ret;
  193. pwmc = kzalloc(sizeof(*pwmc), GFP_KERNEL);
  194. if (!pwmc)
  195. return -ENOMEM;
  196. connection = gb_connection_create(gbphy_dev->bundle,
  197. le16_to_cpu(gbphy_dev->cport_desc->id),
  198. NULL);
  199. if (IS_ERR(connection)) {
  200. ret = PTR_ERR(connection);
  201. goto exit_pwmc_free;
  202. }
  203. pwmc->connection = connection;
  204. gb_connection_set_data(connection, pwmc);
  205. gb_gbphy_set_data(gbphy_dev, pwmc);
  206. ret = gb_connection_enable(connection);
  207. if (ret)
  208. goto exit_connection_destroy;
  209. /* Query number of pwms present */
  210. ret = gb_pwm_count_operation(pwmc);
  211. if (ret)
  212. goto exit_connection_disable;
  213. pwm = &pwmc->chip;
  214. pwm->dev = &gbphy_dev->dev;
  215. pwm->ops = &gb_pwm_ops;
  216. pwm->base = -1; /* Allocate base dynamically */
  217. pwm->npwm = pwmc->pwm_max + 1;
  218. pwm->can_sleep = true; /* FIXME */
  219. ret = pwmchip_add(pwm);
  220. if (ret) {
  221. dev_err(&gbphy_dev->dev,
  222. "failed to register PWM: %d\n", ret);
  223. goto exit_connection_disable;
  224. }
  225. gbphy_runtime_put_autosuspend(gbphy_dev);
  226. return 0;
  227. exit_connection_disable:
  228. gb_connection_disable(connection);
  229. exit_connection_destroy:
  230. gb_connection_destroy(connection);
  231. exit_pwmc_free:
  232. kfree(pwmc);
  233. return ret;
  234. }
  235. static void gb_pwm_remove(struct gbphy_device *gbphy_dev)
  236. {
  237. struct gb_pwm_chip *pwmc = gb_gbphy_get_data(gbphy_dev);
  238. struct gb_connection *connection = pwmc->connection;
  239. int ret;
  240. ret = gbphy_runtime_get_sync(gbphy_dev);
  241. if (ret)
  242. gbphy_runtime_get_noresume(gbphy_dev);
  243. pwmchip_remove(&pwmc->chip);
  244. gb_connection_disable(connection);
  245. gb_connection_destroy(connection);
  246. kfree(pwmc);
  247. }
  248. static const struct gbphy_device_id gb_pwm_id_table[] = {
  249. { GBPHY_PROTOCOL(GREYBUS_PROTOCOL_PWM) },
  250. { },
  251. };
  252. MODULE_DEVICE_TABLE(gbphy, gb_pwm_id_table);
  253. static struct gbphy_driver pwm_driver = {
  254. .name = "pwm",
  255. .probe = gb_pwm_probe,
  256. .remove = gb_pwm_remove,
  257. .id_table = gb_pwm_id_table,
  258. };
  259. module_gbphy_driver(pwm_driver);
  260. MODULE_LICENSE("GPL v2");