gpio-sim.c 38 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * GPIO testing driver based on configfs.
  4. *
  5. * Copyright (C) 2021 Bartosz Golaszewski <[email protected]>
  6. */
  7. #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
  8. #include <linux/bitmap.h>
  9. #include <linux/completion.h>
  10. #include <linux/configfs.h>
  11. #include <linux/device.h>
  12. #include <linux/gpio/driver.h>
  13. #include <linux/gpio/machine.h>
  14. #include <linux/idr.h>
  15. #include <linux/interrupt.h>
  16. #include <linux/irq.h>
  17. #include <linux/irq_sim.h>
  18. #include <linux/list.h>
  19. #include <linux/mod_devicetable.h>
  20. #include <linux/module.h>
  21. #include <linux/mutex.h>
  22. #include <linux/notifier.h>
  23. #include <linux/platform_device.h>
  24. #include <linux/property.h>
  25. #include <linux/slab.h>
  26. #include <linux/string.h>
  27. #include <linux/string_helpers.h>
  28. #include <linux/sysfs.h>
  29. #include "gpiolib.h"
  30. #define GPIO_SIM_PROP_MAX 4 /* Max 3 properties + sentinel. */
  31. #define GPIO_SIM_NUM_ATTRS 3 /* value, pull and sentinel */
  32. static DEFINE_IDA(gpio_sim_ida);
  33. struct gpio_sim_chip {
  34. struct gpio_chip gc;
  35. unsigned long *direction_map;
  36. unsigned long *value_map;
  37. unsigned long *pull_map;
  38. struct irq_domain *irq_sim;
  39. struct mutex lock;
  40. const struct attribute_group **attr_groups;
  41. };
  42. struct gpio_sim_attribute {
  43. struct device_attribute dev_attr;
  44. unsigned int offset;
  45. };
  46. static struct gpio_sim_attribute *
  47. to_gpio_sim_attr(struct device_attribute *dev_attr)
  48. {
  49. return container_of(dev_attr, struct gpio_sim_attribute, dev_attr);
  50. }
  51. static int gpio_sim_apply_pull(struct gpio_sim_chip *chip,
  52. unsigned int offset, int value)
  53. {
  54. int irq, irq_type, ret;
  55. struct gpio_desc *desc;
  56. struct gpio_chip *gc;
  57. gc = &chip->gc;
  58. desc = &gc->gpiodev->descs[offset];
  59. mutex_lock(&chip->lock);
  60. if (test_bit(FLAG_REQUESTED, &desc->flags) &&
  61. !test_bit(FLAG_IS_OUT, &desc->flags)) {
  62. if (value == !!test_bit(offset, chip->value_map))
  63. goto set_pull;
  64. /*
  65. * This is fine - it just means, nobody is listening
  66. * for interrupts on this line, otherwise
  67. * irq_create_mapping() would have been called from
  68. * the to_irq() callback.
  69. */
  70. irq = irq_find_mapping(chip->irq_sim, offset);
  71. if (!irq)
  72. goto set_value;
  73. irq_type = irq_get_trigger_type(irq);
  74. if ((value && (irq_type & IRQ_TYPE_EDGE_RISING)) ||
  75. (!value && (irq_type & IRQ_TYPE_EDGE_FALLING))) {
  76. ret = irq_set_irqchip_state(irq, IRQCHIP_STATE_PENDING,
  77. true);
  78. if (ret)
  79. goto set_pull;
  80. }
  81. }
  82. set_value:
  83. /* Change the value unless we're actively driving the line. */
  84. if (!test_bit(FLAG_REQUESTED, &desc->flags) ||
  85. !test_bit(FLAG_IS_OUT, &desc->flags))
  86. __assign_bit(offset, chip->value_map, value);
  87. set_pull:
  88. __assign_bit(offset, chip->pull_map, value);
  89. mutex_unlock(&chip->lock);
  90. return 0;
  91. }
  92. static int gpio_sim_get(struct gpio_chip *gc, unsigned int offset)
  93. {
  94. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  95. int ret;
  96. mutex_lock(&chip->lock);
  97. ret = !!test_bit(offset, chip->value_map);
  98. mutex_unlock(&chip->lock);
  99. return ret;
  100. }
  101. static void gpio_sim_set(struct gpio_chip *gc, unsigned int offset, int value)
  102. {
  103. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  104. mutex_lock(&chip->lock);
  105. __assign_bit(offset, chip->value_map, value);
  106. mutex_unlock(&chip->lock);
  107. }
  108. static int gpio_sim_get_multiple(struct gpio_chip *gc,
  109. unsigned long *mask, unsigned long *bits)
  110. {
  111. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  112. mutex_lock(&chip->lock);
  113. bitmap_replace(bits, bits, chip->value_map, mask, gc->ngpio);
  114. mutex_unlock(&chip->lock);
  115. return 0;
  116. }
  117. static void gpio_sim_set_multiple(struct gpio_chip *gc,
  118. unsigned long *mask, unsigned long *bits)
  119. {
  120. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  121. mutex_lock(&chip->lock);
  122. bitmap_replace(chip->value_map, chip->value_map, bits, mask, gc->ngpio);
  123. mutex_unlock(&chip->lock);
  124. }
  125. static int gpio_sim_direction_output(struct gpio_chip *gc,
  126. unsigned int offset, int value)
  127. {
  128. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  129. mutex_lock(&chip->lock);
  130. __clear_bit(offset, chip->direction_map);
  131. __assign_bit(offset, chip->value_map, value);
  132. mutex_unlock(&chip->lock);
  133. return 0;
  134. }
  135. static int gpio_sim_direction_input(struct gpio_chip *gc, unsigned int offset)
  136. {
  137. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  138. mutex_lock(&chip->lock);
  139. __set_bit(offset, chip->direction_map);
  140. mutex_unlock(&chip->lock);
  141. return 0;
  142. }
  143. static int gpio_sim_get_direction(struct gpio_chip *gc, unsigned int offset)
  144. {
  145. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  146. int direction;
  147. mutex_lock(&chip->lock);
  148. direction = !!test_bit(offset, chip->direction_map);
  149. mutex_unlock(&chip->lock);
  150. return direction ? GPIO_LINE_DIRECTION_IN : GPIO_LINE_DIRECTION_OUT;
  151. }
  152. static int gpio_sim_set_config(struct gpio_chip *gc,
  153. unsigned int offset, unsigned long config)
  154. {
  155. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  156. switch (pinconf_to_config_param(config)) {
  157. case PIN_CONFIG_BIAS_PULL_UP:
  158. return gpio_sim_apply_pull(chip, offset, 1);
  159. case PIN_CONFIG_BIAS_PULL_DOWN:
  160. return gpio_sim_apply_pull(chip, offset, 0);
  161. default:
  162. break;
  163. }
  164. return -ENOTSUPP;
  165. }
  166. static int gpio_sim_to_irq(struct gpio_chip *gc, unsigned int offset)
  167. {
  168. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  169. return irq_create_mapping(chip->irq_sim, offset);
  170. }
  171. static void gpio_sim_free(struct gpio_chip *gc, unsigned int offset)
  172. {
  173. struct gpio_sim_chip *chip = gpiochip_get_data(gc);
  174. mutex_lock(&chip->lock);
  175. __assign_bit(offset, chip->value_map, !!test_bit(offset, chip->pull_map));
  176. mutex_unlock(&chip->lock);
  177. }
  178. static ssize_t gpio_sim_sysfs_val_show(struct device *dev,
  179. struct device_attribute *attr, char *buf)
  180. {
  181. struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
  182. struct gpio_sim_chip *chip = dev_get_drvdata(dev);
  183. int val;
  184. mutex_lock(&chip->lock);
  185. val = !!test_bit(line_attr->offset, chip->value_map);
  186. mutex_unlock(&chip->lock);
  187. return sysfs_emit(buf, "%d\n", val);
  188. }
  189. static ssize_t gpio_sim_sysfs_val_store(struct device *dev,
  190. struct device_attribute *attr,
  191. const char *buf, size_t count)
  192. {
  193. /*
  194. * Not assigning this function will result in write() returning -EIO
  195. * which is confusing. Return -EPERM explicitly.
  196. */
  197. return -EPERM;
  198. }
  199. static const char *const gpio_sim_sysfs_pull_strings[] = {
  200. [0] = "pull-down",
  201. [1] = "pull-up",
  202. };
  203. static ssize_t gpio_sim_sysfs_pull_show(struct device *dev,
  204. struct device_attribute *attr,
  205. char *buf)
  206. {
  207. struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
  208. struct gpio_sim_chip *chip = dev_get_drvdata(dev);
  209. int pull;
  210. mutex_lock(&chip->lock);
  211. pull = !!test_bit(line_attr->offset, chip->pull_map);
  212. mutex_unlock(&chip->lock);
  213. return sysfs_emit(buf, "%s\n", gpio_sim_sysfs_pull_strings[pull]);
  214. }
  215. static ssize_t gpio_sim_sysfs_pull_store(struct device *dev,
  216. struct device_attribute *attr,
  217. const char *buf, size_t len)
  218. {
  219. struct gpio_sim_attribute *line_attr = to_gpio_sim_attr(attr);
  220. struct gpio_sim_chip *chip = dev_get_drvdata(dev);
  221. int ret, pull;
  222. pull = sysfs_match_string(gpio_sim_sysfs_pull_strings, buf);
  223. if (pull < 0)
  224. return pull;
  225. ret = gpio_sim_apply_pull(chip, line_attr->offset, pull);
  226. if (ret)
  227. return ret;
  228. return len;
  229. }
  230. static void gpio_sim_mutex_destroy(void *data)
  231. {
  232. struct mutex *lock = data;
  233. mutex_destroy(lock);
  234. }
  235. static void gpio_sim_dispose_mappings(void *data)
  236. {
  237. struct gpio_sim_chip *chip = data;
  238. unsigned int i;
  239. for (i = 0; i < chip->gc.ngpio; i++)
  240. irq_dispose_mapping(irq_find_mapping(chip->irq_sim, i));
  241. }
  242. static void gpio_sim_sysfs_remove(void *data)
  243. {
  244. struct gpio_sim_chip *chip = data;
  245. sysfs_remove_groups(&chip->gc.gpiodev->dev.kobj, chip->attr_groups);
  246. }
  247. static int gpio_sim_setup_sysfs(struct gpio_sim_chip *chip)
  248. {
  249. struct device_attribute *val_dev_attr, *pull_dev_attr;
  250. struct gpio_sim_attribute *val_attr, *pull_attr;
  251. unsigned int num_lines = chip->gc.ngpio;
  252. struct device *dev = chip->gc.parent;
  253. struct attribute_group *attr_group;
  254. struct attribute **attrs;
  255. int i, ret;
  256. chip->attr_groups = devm_kcalloc(dev, sizeof(*chip->attr_groups),
  257. num_lines + 1, GFP_KERNEL);
  258. if (!chip->attr_groups)
  259. return -ENOMEM;
  260. for (i = 0; i < num_lines; i++) {
  261. attr_group = devm_kzalloc(dev, sizeof(*attr_group), GFP_KERNEL);
  262. attrs = devm_kcalloc(dev, GPIO_SIM_NUM_ATTRS, sizeof(*attrs),
  263. GFP_KERNEL);
  264. val_attr = devm_kzalloc(dev, sizeof(*val_attr), GFP_KERNEL);
  265. pull_attr = devm_kzalloc(dev, sizeof(*pull_attr), GFP_KERNEL);
  266. if (!attr_group || !attrs || !val_attr || !pull_attr)
  267. return -ENOMEM;
  268. attr_group->name = devm_kasprintf(dev, GFP_KERNEL,
  269. "sim_gpio%u", i);
  270. if (!attr_group->name)
  271. return -ENOMEM;
  272. val_attr->offset = pull_attr->offset = i;
  273. val_dev_attr = &val_attr->dev_attr;
  274. pull_dev_attr = &pull_attr->dev_attr;
  275. sysfs_attr_init(&val_dev_attr->attr);
  276. sysfs_attr_init(&pull_dev_attr->attr);
  277. val_dev_attr->attr.name = "value";
  278. pull_dev_attr->attr.name = "pull";
  279. val_dev_attr->attr.mode = pull_dev_attr->attr.mode = 0644;
  280. val_dev_attr->show = gpio_sim_sysfs_val_show;
  281. val_dev_attr->store = gpio_sim_sysfs_val_store;
  282. pull_dev_attr->show = gpio_sim_sysfs_pull_show;
  283. pull_dev_attr->store = gpio_sim_sysfs_pull_store;
  284. attrs[0] = &val_dev_attr->attr;
  285. attrs[1] = &pull_dev_attr->attr;
  286. attr_group->attrs = attrs;
  287. chip->attr_groups[i] = attr_group;
  288. }
  289. ret = sysfs_create_groups(&chip->gc.gpiodev->dev.kobj,
  290. chip->attr_groups);
  291. if (ret)
  292. return ret;
  293. return devm_add_action_or_reset(dev, gpio_sim_sysfs_remove, chip);
  294. }
  295. static int gpio_sim_add_bank(struct fwnode_handle *swnode, struct device *dev)
  296. {
  297. struct gpio_sim_chip *chip;
  298. struct gpio_chip *gc;
  299. const char *label;
  300. u32 num_lines;
  301. int ret;
  302. ret = fwnode_property_read_u32(swnode, "ngpios", &num_lines);
  303. if (ret)
  304. return ret;
  305. ret = fwnode_property_read_string(swnode, "gpio-sim,label", &label);
  306. if (ret) {
  307. label = devm_kasprintf(dev, GFP_KERNEL, "%s-%s",
  308. dev_name(dev), fwnode_get_name(swnode));
  309. if (!label)
  310. return -ENOMEM;
  311. }
  312. chip = devm_kzalloc(dev, sizeof(*chip), GFP_KERNEL);
  313. if (!chip)
  314. return -ENOMEM;
  315. chip->direction_map = devm_bitmap_alloc(dev, num_lines, GFP_KERNEL);
  316. if (!chip->direction_map)
  317. return -ENOMEM;
  318. /* Default to input mode. */
  319. bitmap_fill(chip->direction_map, num_lines);
  320. chip->value_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
  321. if (!chip->value_map)
  322. return -ENOMEM;
  323. chip->pull_map = devm_bitmap_zalloc(dev, num_lines, GFP_KERNEL);
  324. if (!chip->pull_map)
  325. return -ENOMEM;
  326. chip->irq_sim = devm_irq_domain_create_sim(dev, swnode, num_lines);
  327. if (IS_ERR(chip->irq_sim))
  328. return PTR_ERR(chip->irq_sim);
  329. ret = devm_add_action_or_reset(dev, gpio_sim_dispose_mappings, chip);
  330. if (ret)
  331. return ret;
  332. mutex_init(&chip->lock);
  333. ret = devm_add_action_or_reset(dev, gpio_sim_mutex_destroy,
  334. &chip->lock);
  335. if (ret)
  336. return ret;
  337. gc = &chip->gc;
  338. gc->base = -1;
  339. gc->ngpio = num_lines;
  340. gc->label = label;
  341. gc->owner = THIS_MODULE;
  342. gc->parent = dev;
  343. gc->fwnode = swnode;
  344. gc->get = gpio_sim_get;
  345. gc->set = gpio_sim_set;
  346. gc->get_multiple = gpio_sim_get_multiple;
  347. gc->set_multiple = gpio_sim_set_multiple;
  348. gc->direction_output = gpio_sim_direction_output;
  349. gc->direction_input = gpio_sim_direction_input;
  350. gc->get_direction = gpio_sim_get_direction;
  351. gc->set_config = gpio_sim_set_config;
  352. gc->to_irq = gpio_sim_to_irq;
  353. gc->free = gpio_sim_free;
  354. gc->can_sleep = true;
  355. ret = devm_gpiochip_add_data(dev, gc, chip);
  356. if (ret)
  357. return ret;
  358. /* Used by sysfs and configfs callbacks. */
  359. dev_set_drvdata(&gc->gpiodev->dev, chip);
  360. return gpio_sim_setup_sysfs(chip);
  361. }
  362. static int gpio_sim_probe(struct platform_device *pdev)
  363. {
  364. struct device *dev = &pdev->dev;
  365. struct fwnode_handle *swnode;
  366. int ret;
  367. device_for_each_child_node(dev, swnode) {
  368. ret = gpio_sim_add_bank(swnode, dev);
  369. if (ret) {
  370. fwnode_handle_put(swnode);
  371. return ret;
  372. }
  373. }
  374. return 0;
  375. }
  376. static const struct of_device_id gpio_sim_of_match[] = {
  377. { .compatible = "gpio-simulator" },
  378. { }
  379. };
  380. MODULE_DEVICE_TABLE(of, gpio_sim_of_match);
  381. static struct platform_driver gpio_sim_driver = {
  382. .driver = {
  383. .name = "gpio-sim",
  384. .of_match_table = gpio_sim_of_match,
  385. },
  386. .probe = gpio_sim_probe,
  387. };
  388. struct gpio_sim_device {
  389. struct config_group group;
  390. /*
  391. * If pdev is NULL, the device is 'pending' (waiting for configuration).
  392. * Once the pointer is assigned, the device has been created and the
  393. * item is 'live'.
  394. */
  395. struct platform_device *pdev;
  396. int id;
  397. /*
  398. * Each configfs filesystem operation is protected with the subsystem
  399. * mutex. Each separate attribute is protected with the buffer mutex.
  400. * This structure however can be modified by callbacks of different
  401. * attributes so we need another lock.
  402. *
  403. * We use this lock fo protecting all data structures owned by this
  404. * object too.
  405. */
  406. struct mutex lock;
  407. /*
  408. * This is used to synchronously wait for the driver's probe to complete
  409. * and notify the user-space about any errors.
  410. */
  411. struct notifier_block bus_notifier;
  412. struct completion probe_completion;
  413. bool driver_bound;
  414. struct gpiod_hog *hogs;
  415. struct list_head bank_list;
  416. };
  417. /* This is called with dev->lock already taken. */
  418. static int gpio_sim_bus_notifier_call(struct notifier_block *nb,
  419. unsigned long action, void *data)
  420. {
  421. struct gpio_sim_device *simdev = container_of(nb,
  422. struct gpio_sim_device,
  423. bus_notifier);
  424. struct device *dev = data;
  425. char devname[32];
  426. snprintf(devname, sizeof(devname), "gpio-sim.%u", simdev->id);
  427. if (strcmp(dev_name(dev), devname) == 0) {
  428. if (action == BUS_NOTIFY_BOUND_DRIVER)
  429. simdev->driver_bound = true;
  430. else if (action == BUS_NOTIFY_DRIVER_NOT_BOUND)
  431. simdev->driver_bound = false;
  432. else
  433. return NOTIFY_DONE;
  434. complete(&simdev->probe_completion);
  435. return NOTIFY_OK;
  436. }
  437. return NOTIFY_DONE;
  438. }
  439. static struct gpio_sim_device *to_gpio_sim_device(struct config_item *item)
  440. {
  441. struct config_group *group = to_config_group(item);
  442. return container_of(group, struct gpio_sim_device, group);
  443. }
  444. struct gpio_sim_bank {
  445. struct config_group group;
  446. /*
  447. * We could have used the ci_parent field of the config_item but
  448. * configfs is stupid and calls the item's release callback after
  449. * already having cleared the parent pointer even though the parent
  450. * is guaranteed to survive the child...
  451. *
  452. * So we need to store the pointer to the parent struct here. We can
  453. * dereference it anywhere we need with no checks and no locking as
  454. * it's guaranteed to survive the children and protected by configfs
  455. * locks.
  456. *
  457. * Same for other structures.
  458. */
  459. struct gpio_sim_device *parent;
  460. struct list_head siblings;
  461. char *label;
  462. unsigned int num_lines;
  463. struct list_head line_list;
  464. struct fwnode_handle *swnode;
  465. };
  466. static struct gpio_sim_bank *to_gpio_sim_bank(struct config_item *item)
  467. {
  468. struct config_group *group = to_config_group(item);
  469. return container_of(group, struct gpio_sim_bank, group);
  470. }
  471. static bool gpio_sim_bank_has_label(struct gpio_sim_bank *bank)
  472. {
  473. return bank->label && *bank->label;
  474. }
  475. static struct gpio_sim_device *
  476. gpio_sim_bank_get_device(struct gpio_sim_bank *bank)
  477. {
  478. return bank->parent;
  479. }
  480. struct gpio_sim_hog;
  481. struct gpio_sim_line {
  482. struct config_group group;
  483. struct gpio_sim_bank *parent;
  484. struct list_head siblings;
  485. unsigned int offset;
  486. char *name;
  487. /* There can only be one hog per line. */
  488. struct gpio_sim_hog *hog;
  489. };
  490. static struct gpio_sim_line *to_gpio_sim_line(struct config_item *item)
  491. {
  492. struct config_group *group = to_config_group(item);
  493. return container_of(group, struct gpio_sim_line, group);
  494. }
  495. static struct gpio_sim_device *
  496. gpio_sim_line_get_device(struct gpio_sim_line *line)
  497. {
  498. struct gpio_sim_bank *bank = line->parent;
  499. return gpio_sim_bank_get_device(bank);
  500. }
  501. struct gpio_sim_hog {
  502. struct config_item item;
  503. struct gpio_sim_line *parent;
  504. char *name;
  505. int dir;
  506. };
  507. static struct gpio_sim_hog *to_gpio_sim_hog(struct config_item *item)
  508. {
  509. return container_of(item, struct gpio_sim_hog, item);
  510. }
  511. static struct gpio_sim_device *gpio_sim_hog_get_device(struct gpio_sim_hog *hog)
  512. {
  513. struct gpio_sim_line *line = hog->parent;
  514. return gpio_sim_line_get_device(line);
  515. }
  516. static bool gpio_sim_device_is_live_unlocked(struct gpio_sim_device *dev)
  517. {
  518. return !!dev->pdev;
  519. }
  520. static char *gpio_sim_strdup_trimmed(const char *str, size_t count)
  521. {
  522. char *dup, *trimmed;
  523. dup = kstrndup(str, count, GFP_KERNEL);
  524. if (!dup)
  525. return NULL;
  526. trimmed = strstrip(dup);
  527. memmove(dup, trimmed, strlen(trimmed) + 1);
  528. return dup;
  529. }
  530. static ssize_t gpio_sim_device_config_dev_name_show(struct config_item *item,
  531. char *page)
  532. {
  533. struct gpio_sim_device *dev = to_gpio_sim_device(item);
  534. struct platform_device *pdev;
  535. int ret;
  536. mutex_lock(&dev->lock);
  537. pdev = dev->pdev;
  538. if (pdev)
  539. ret = sprintf(page, "%s\n", dev_name(&pdev->dev));
  540. else
  541. ret = sprintf(page, "gpio-sim.%d\n", dev->id);
  542. mutex_unlock(&dev->lock);
  543. return ret;
  544. }
  545. CONFIGFS_ATTR_RO(gpio_sim_device_config_, dev_name);
  546. static ssize_t
  547. gpio_sim_device_config_live_show(struct config_item *item, char *page)
  548. {
  549. struct gpio_sim_device *dev = to_gpio_sim_device(item);
  550. bool live;
  551. mutex_lock(&dev->lock);
  552. live = gpio_sim_device_is_live_unlocked(dev);
  553. mutex_unlock(&dev->lock);
  554. return sprintf(page, "%c\n", live ? '1' : '0');
  555. }
  556. static char **gpio_sim_make_line_names(struct gpio_sim_bank *bank,
  557. unsigned int *line_names_size)
  558. {
  559. unsigned int max_offset = 0;
  560. bool has_line_names = false;
  561. struct gpio_sim_line *line;
  562. char **line_names;
  563. list_for_each_entry(line, &bank->line_list, siblings) {
  564. if (line->name) {
  565. if (line->offset > max_offset)
  566. max_offset = line->offset;
  567. /*
  568. * max_offset can stay at 0 so it's not an indicator
  569. * of whether line names were configured at all.
  570. */
  571. has_line_names = true;
  572. }
  573. }
  574. if (!has_line_names)
  575. /*
  576. * This is not an error - NULL means, there are no line
  577. * names configured.
  578. */
  579. return NULL;
  580. *line_names_size = max_offset + 1;
  581. line_names = kcalloc(*line_names_size, sizeof(*line_names), GFP_KERNEL);
  582. if (!line_names)
  583. return ERR_PTR(-ENOMEM);
  584. list_for_each_entry(line, &bank->line_list, siblings) {
  585. if (line->name && (line->offset <= max_offset))
  586. line_names[line->offset] = line->name;
  587. }
  588. return line_names;
  589. }
  590. static void gpio_sim_remove_hogs(struct gpio_sim_device *dev)
  591. {
  592. struct gpiod_hog *hog;
  593. if (!dev->hogs)
  594. return;
  595. gpiod_remove_hogs(dev->hogs);
  596. for (hog = dev->hogs; hog->chip_label; hog++) {
  597. kfree(hog->chip_label);
  598. kfree(hog->line_name);
  599. }
  600. kfree(dev->hogs);
  601. dev->hogs = NULL;
  602. }
  603. static int gpio_sim_add_hogs(struct gpio_sim_device *dev)
  604. {
  605. unsigned int num_hogs = 0, idx = 0;
  606. struct gpio_sim_bank *bank;
  607. struct gpio_sim_line *line;
  608. struct gpiod_hog *hog;
  609. list_for_each_entry(bank, &dev->bank_list, siblings) {
  610. list_for_each_entry(line, &bank->line_list, siblings) {
  611. if (line->hog)
  612. num_hogs++;
  613. }
  614. }
  615. if (!num_hogs)
  616. return 0;
  617. /* Allocate one more for the sentinel. */
  618. dev->hogs = kcalloc(num_hogs + 1, sizeof(*dev->hogs), GFP_KERNEL);
  619. if (!dev->hogs)
  620. return -ENOMEM;
  621. list_for_each_entry(bank, &dev->bank_list, siblings) {
  622. list_for_each_entry(line, &bank->line_list, siblings) {
  623. if (!line->hog)
  624. continue;
  625. hog = &dev->hogs[idx++];
  626. /*
  627. * We need to make this string manually because at this
  628. * point the device doesn't exist yet and so dev_name()
  629. * is not available.
  630. */
  631. if (gpio_sim_bank_has_label(bank))
  632. hog->chip_label = kstrdup(bank->label,
  633. GFP_KERNEL);
  634. else
  635. hog->chip_label = kasprintf(GFP_KERNEL,
  636. "gpio-sim.%u-%s",
  637. dev->id,
  638. fwnode_get_name(
  639. bank->swnode));
  640. if (!hog->chip_label) {
  641. gpio_sim_remove_hogs(dev);
  642. return -ENOMEM;
  643. }
  644. /*
  645. * We need to duplicate this because the hog config
  646. * item can be removed at any time (and we can't block
  647. * it) and gpiolib doesn't make a deep copy of the hog
  648. * data.
  649. */
  650. if (line->hog->name) {
  651. hog->line_name = kstrdup(line->hog->name,
  652. GFP_KERNEL);
  653. if (!hog->line_name) {
  654. gpio_sim_remove_hogs(dev);
  655. return -ENOMEM;
  656. }
  657. }
  658. hog->chip_hwnum = line->offset;
  659. hog->dflags = line->hog->dir;
  660. }
  661. }
  662. gpiod_add_hogs(dev->hogs);
  663. return 0;
  664. }
  665. static struct fwnode_handle *
  666. gpio_sim_make_bank_swnode(struct gpio_sim_bank *bank,
  667. struct fwnode_handle *parent)
  668. {
  669. struct property_entry properties[GPIO_SIM_PROP_MAX];
  670. unsigned int prop_idx = 0, line_names_size = 0;
  671. struct fwnode_handle *swnode;
  672. char **line_names;
  673. memset(properties, 0, sizeof(properties));
  674. properties[prop_idx++] = PROPERTY_ENTRY_U32("ngpios", bank->num_lines);
  675. if (gpio_sim_bank_has_label(bank))
  676. properties[prop_idx++] = PROPERTY_ENTRY_STRING("gpio-sim,label",
  677. bank->label);
  678. line_names = gpio_sim_make_line_names(bank, &line_names_size);
  679. if (IS_ERR(line_names))
  680. return ERR_CAST(line_names);
  681. if (line_names)
  682. properties[prop_idx++] = PROPERTY_ENTRY_STRING_ARRAY_LEN(
  683. "gpio-line-names",
  684. line_names, line_names_size);
  685. swnode = fwnode_create_software_node(properties, parent);
  686. kfree(line_names);
  687. return swnode;
  688. }
  689. static void gpio_sim_remove_swnode_recursive(struct fwnode_handle *swnode)
  690. {
  691. struct fwnode_handle *child;
  692. fwnode_for_each_child_node(swnode, child)
  693. fwnode_remove_software_node(child);
  694. fwnode_remove_software_node(swnode);
  695. }
  696. static bool gpio_sim_bank_labels_non_unique(struct gpio_sim_device *dev)
  697. {
  698. struct gpio_sim_bank *this, *pos;
  699. list_for_each_entry(this, &dev->bank_list, siblings) {
  700. list_for_each_entry(pos, &dev->bank_list, siblings) {
  701. if (this == pos || (!this->label || !pos->label))
  702. continue;
  703. if (strcmp(this->label, pos->label) == 0)
  704. return true;
  705. }
  706. }
  707. return false;
  708. }
  709. static int gpio_sim_device_activate_unlocked(struct gpio_sim_device *dev)
  710. {
  711. struct platform_device_info pdevinfo;
  712. struct fwnode_handle *swnode;
  713. struct platform_device *pdev;
  714. struct gpio_sim_bank *bank;
  715. int ret;
  716. if (list_empty(&dev->bank_list))
  717. return -ENODATA;
  718. /*
  719. * Non-unique GPIO device labels are a corner-case we don't support
  720. * as it would interfere with machine hogging mechanism and has little
  721. * use in real life.
  722. */
  723. if (gpio_sim_bank_labels_non_unique(dev))
  724. return -EINVAL;
  725. memset(&pdevinfo, 0, sizeof(pdevinfo));
  726. swnode = fwnode_create_software_node(NULL, NULL);
  727. if (IS_ERR(swnode))
  728. return PTR_ERR(swnode);
  729. list_for_each_entry(bank, &dev->bank_list, siblings) {
  730. bank->swnode = gpio_sim_make_bank_swnode(bank, swnode);
  731. if (IS_ERR(bank->swnode)) {
  732. ret = PTR_ERR(bank->swnode);
  733. gpio_sim_remove_swnode_recursive(swnode);
  734. return ret;
  735. }
  736. }
  737. ret = gpio_sim_add_hogs(dev);
  738. if (ret) {
  739. gpio_sim_remove_swnode_recursive(swnode);
  740. return ret;
  741. }
  742. pdevinfo.name = "gpio-sim";
  743. pdevinfo.fwnode = swnode;
  744. pdevinfo.id = dev->id;
  745. reinit_completion(&dev->probe_completion);
  746. dev->driver_bound = false;
  747. bus_register_notifier(&platform_bus_type, &dev->bus_notifier);
  748. pdev = platform_device_register_full(&pdevinfo);
  749. if (IS_ERR(pdev)) {
  750. bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);
  751. gpio_sim_remove_hogs(dev);
  752. gpio_sim_remove_swnode_recursive(swnode);
  753. return PTR_ERR(pdev);
  754. }
  755. wait_for_completion(&dev->probe_completion);
  756. bus_unregister_notifier(&platform_bus_type, &dev->bus_notifier);
  757. if (!dev->driver_bound) {
  758. /* Probe failed, check kernel log. */
  759. platform_device_unregister(pdev);
  760. gpio_sim_remove_hogs(dev);
  761. gpio_sim_remove_swnode_recursive(swnode);
  762. return -ENXIO;
  763. }
  764. dev->pdev = pdev;
  765. return 0;
  766. }
  767. static void gpio_sim_device_deactivate_unlocked(struct gpio_sim_device *dev)
  768. {
  769. struct fwnode_handle *swnode;
  770. swnode = dev_fwnode(&dev->pdev->dev);
  771. platform_device_unregister(dev->pdev);
  772. gpio_sim_remove_swnode_recursive(swnode);
  773. dev->pdev = NULL;
  774. gpio_sim_remove_hogs(dev);
  775. }
  776. static ssize_t
  777. gpio_sim_device_config_live_store(struct config_item *item,
  778. const char *page, size_t count)
  779. {
  780. struct gpio_sim_device *dev = to_gpio_sim_device(item);
  781. bool live;
  782. int ret;
  783. ret = kstrtobool(page, &live);
  784. if (ret)
  785. return ret;
  786. mutex_lock(&dev->lock);
  787. if ((!live && !gpio_sim_device_is_live_unlocked(dev)) ||
  788. (live && gpio_sim_device_is_live_unlocked(dev)))
  789. ret = -EPERM;
  790. else if (live)
  791. ret = gpio_sim_device_activate_unlocked(dev);
  792. else
  793. gpio_sim_device_deactivate_unlocked(dev);
  794. mutex_unlock(&dev->lock);
  795. return ret ?: count;
  796. }
  797. CONFIGFS_ATTR(gpio_sim_device_config_, live);
  798. static struct configfs_attribute *gpio_sim_device_config_attrs[] = {
  799. &gpio_sim_device_config_attr_dev_name,
  800. &gpio_sim_device_config_attr_live,
  801. NULL
  802. };
  803. struct gpio_sim_chip_name_ctx {
  804. struct fwnode_handle *swnode;
  805. char *page;
  806. };
  807. static int gpio_sim_emit_chip_name(struct device *dev, void *data)
  808. {
  809. struct gpio_sim_chip_name_ctx *ctx = data;
  810. /* This would be the sysfs device exported in /sys/class/gpio. */
  811. if (dev->class)
  812. return 0;
  813. if (device_match_fwnode(dev, ctx->swnode))
  814. return sprintf(ctx->page, "%s\n", dev_name(dev));
  815. return 0;
  816. }
  817. static ssize_t gpio_sim_bank_config_chip_name_show(struct config_item *item,
  818. char *page)
  819. {
  820. struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
  821. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  822. struct gpio_sim_chip_name_ctx ctx = { bank->swnode, page };
  823. int ret;
  824. mutex_lock(&dev->lock);
  825. if (gpio_sim_device_is_live_unlocked(dev))
  826. ret = device_for_each_child(&dev->pdev->dev, &ctx,
  827. gpio_sim_emit_chip_name);
  828. else
  829. ret = sprintf(page, "none\n");
  830. mutex_unlock(&dev->lock);
  831. return ret;
  832. }
  833. CONFIGFS_ATTR_RO(gpio_sim_bank_config_, chip_name);
  834. static ssize_t
  835. gpio_sim_bank_config_label_show(struct config_item *item, char *page)
  836. {
  837. struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
  838. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  839. int ret;
  840. mutex_lock(&dev->lock);
  841. ret = sprintf(page, "%s\n", bank->label ?: "");
  842. mutex_unlock(&dev->lock);
  843. return ret;
  844. }
  845. static ssize_t gpio_sim_bank_config_label_store(struct config_item *item,
  846. const char *page, size_t count)
  847. {
  848. struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
  849. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  850. char *trimmed;
  851. mutex_lock(&dev->lock);
  852. if (gpio_sim_device_is_live_unlocked(dev)) {
  853. mutex_unlock(&dev->lock);
  854. return -EBUSY;
  855. }
  856. trimmed = gpio_sim_strdup_trimmed(page, count);
  857. if (!trimmed) {
  858. mutex_unlock(&dev->lock);
  859. return -ENOMEM;
  860. }
  861. kfree(bank->label);
  862. bank->label = trimmed;
  863. mutex_unlock(&dev->lock);
  864. return count;
  865. }
  866. CONFIGFS_ATTR(gpio_sim_bank_config_, label);
  867. static ssize_t
  868. gpio_sim_bank_config_num_lines_show(struct config_item *item, char *page)
  869. {
  870. struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
  871. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  872. int ret;
  873. mutex_lock(&dev->lock);
  874. ret = sprintf(page, "%u\n", bank->num_lines);
  875. mutex_unlock(&dev->lock);
  876. return ret;
  877. }
  878. static ssize_t
  879. gpio_sim_bank_config_num_lines_store(struct config_item *item,
  880. const char *page, size_t count)
  881. {
  882. struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
  883. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  884. unsigned int num_lines;
  885. int ret;
  886. ret = kstrtouint(page, 0, &num_lines);
  887. if (ret)
  888. return ret;
  889. if (num_lines == 0)
  890. return -EINVAL;
  891. mutex_lock(&dev->lock);
  892. if (gpio_sim_device_is_live_unlocked(dev)) {
  893. mutex_unlock(&dev->lock);
  894. return -EBUSY;
  895. }
  896. bank->num_lines = num_lines;
  897. mutex_unlock(&dev->lock);
  898. return count;
  899. }
  900. CONFIGFS_ATTR(gpio_sim_bank_config_, num_lines);
  901. static struct configfs_attribute *gpio_sim_bank_config_attrs[] = {
  902. &gpio_sim_bank_config_attr_chip_name,
  903. &gpio_sim_bank_config_attr_label,
  904. &gpio_sim_bank_config_attr_num_lines,
  905. NULL
  906. };
  907. static ssize_t
  908. gpio_sim_line_config_name_show(struct config_item *item, char *page)
  909. {
  910. struct gpio_sim_line *line = to_gpio_sim_line(item);
  911. struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
  912. int ret;
  913. mutex_lock(&dev->lock);
  914. ret = sprintf(page, "%s\n", line->name ?: "");
  915. mutex_unlock(&dev->lock);
  916. return ret;
  917. }
  918. static ssize_t gpio_sim_line_config_name_store(struct config_item *item,
  919. const char *page, size_t count)
  920. {
  921. struct gpio_sim_line *line = to_gpio_sim_line(item);
  922. struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
  923. char *trimmed;
  924. mutex_lock(&dev->lock);
  925. if (gpio_sim_device_is_live_unlocked(dev)) {
  926. mutex_unlock(&dev->lock);
  927. return -EBUSY;
  928. }
  929. trimmed = gpio_sim_strdup_trimmed(page, count);
  930. if (!trimmed) {
  931. mutex_unlock(&dev->lock);
  932. return -ENOMEM;
  933. }
  934. kfree(line->name);
  935. line->name = trimmed;
  936. mutex_unlock(&dev->lock);
  937. return count;
  938. }
  939. CONFIGFS_ATTR(gpio_sim_line_config_, name);
  940. static struct configfs_attribute *gpio_sim_line_config_attrs[] = {
  941. &gpio_sim_line_config_attr_name,
  942. NULL
  943. };
  944. static ssize_t gpio_sim_hog_config_name_show(struct config_item *item,
  945. char *page)
  946. {
  947. struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
  948. struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
  949. int ret;
  950. mutex_lock(&dev->lock);
  951. ret = sprintf(page, "%s\n", hog->name ?: "");
  952. mutex_unlock(&dev->lock);
  953. return ret;
  954. }
  955. static ssize_t gpio_sim_hog_config_name_store(struct config_item *item,
  956. const char *page, size_t count)
  957. {
  958. struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
  959. struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
  960. char *trimmed;
  961. mutex_lock(&dev->lock);
  962. if (gpio_sim_device_is_live_unlocked(dev)) {
  963. mutex_unlock(&dev->lock);
  964. return -EBUSY;
  965. }
  966. trimmed = gpio_sim_strdup_trimmed(page, count);
  967. if (!trimmed) {
  968. mutex_unlock(&dev->lock);
  969. return -ENOMEM;
  970. }
  971. kfree(hog->name);
  972. hog->name = trimmed;
  973. mutex_unlock(&dev->lock);
  974. return count;
  975. }
  976. CONFIGFS_ATTR(gpio_sim_hog_config_, name);
  977. static ssize_t gpio_sim_hog_config_direction_show(struct config_item *item,
  978. char *page)
  979. {
  980. struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
  981. struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
  982. char *repr;
  983. int dir;
  984. mutex_lock(&dev->lock);
  985. dir = hog->dir;
  986. mutex_unlock(&dev->lock);
  987. switch (dir) {
  988. case GPIOD_IN:
  989. repr = "input";
  990. break;
  991. case GPIOD_OUT_HIGH:
  992. repr = "output-high";
  993. break;
  994. case GPIOD_OUT_LOW:
  995. repr = "output-low";
  996. break;
  997. default:
  998. /* This would be a programmer bug. */
  999. WARN(1, "Unexpected hog direction value: %d", dir);
  1000. return -EINVAL;
  1001. }
  1002. return sprintf(page, "%s\n", repr);
  1003. }
  1004. static ssize_t
  1005. gpio_sim_hog_config_direction_store(struct config_item *item,
  1006. const char *page, size_t count)
  1007. {
  1008. struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
  1009. struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
  1010. char *trimmed;
  1011. int dir;
  1012. mutex_lock(&dev->lock);
  1013. if (gpio_sim_device_is_live_unlocked(dev)) {
  1014. mutex_unlock(&dev->lock);
  1015. return -EBUSY;
  1016. }
  1017. trimmed = gpio_sim_strdup_trimmed(page, count);
  1018. if (!trimmed) {
  1019. mutex_unlock(&dev->lock);
  1020. return -ENOMEM;
  1021. }
  1022. if (strcmp(trimmed, "input") == 0)
  1023. dir = GPIOD_IN;
  1024. else if (strcmp(trimmed, "output-high") == 0)
  1025. dir = GPIOD_OUT_HIGH;
  1026. else if (strcmp(trimmed, "output-low") == 0)
  1027. dir = GPIOD_OUT_LOW;
  1028. else
  1029. dir = -EINVAL;
  1030. kfree(trimmed);
  1031. if (dir < 0) {
  1032. mutex_unlock(&dev->lock);
  1033. return dir;
  1034. }
  1035. hog->dir = dir;
  1036. mutex_unlock(&dev->lock);
  1037. return count;
  1038. }
  1039. CONFIGFS_ATTR(gpio_sim_hog_config_, direction);
  1040. static struct configfs_attribute *gpio_sim_hog_config_attrs[] = {
  1041. &gpio_sim_hog_config_attr_name,
  1042. &gpio_sim_hog_config_attr_direction,
  1043. NULL
  1044. };
  1045. static void gpio_sim_hog_config_item_release(struct config_item *item)
  1046. {
  1047. struct gpio_sim_hog *hog = to_gpio_sim_hog(item);
  1048. struct gpio_sim_line *line = hog->parent;
  1049. struct gpio_sim_device *dev = gpio_sim_hog_get_device(hog);
  1050. mutex_lock(&dev->lock);
  1051. line->hog = NULL;
  1052. mutex_unlock(&dev->lock);
  1053. kfree(hog->name);
  1054. kfree(hog);
  1055. }
  1056. static struct configfs_item_operations gpio_sim_hog_config_item_ops = {
  1057. .release = gpio_sim_hog_config_item_release,
  1058. };
  1059. static const struct config_item_type gpio_sim_hog_config_type = {
  1060. .ct_item_ops = &gpio_sim_hog_config_item_ops,
  1061. .ct_attrs = gpio_sim_hog_config_attrs,
  1062. .ct_owner = THIS_MODULE,
  1063. };
  1064. static struct config_item *
  1065. gpio_sim_line_config_make_hog_item(struct config_group *group, const char *name)
  1066. {
  1067. struct gpio_sim_line *line = to_gpio_sim_line(&group->cg_item);
  1068. struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
  1069. struct gpio_sim_hog *hog;
  1070. if (strcmp(name, "hog") != 0)
  1071. return ERR_PTR(-EINVAL);
  1072. mutex_lock(&dev->lock);
  1073. hog = kzalloc(sizeof(*hog), GFP_KERNEL);
  1074. if (!hog) {
  1075. mutex_unlock(&dev->lock);
  1076. return ERR_PTR(-ENOMEM);
  1077. }
  1078. config_item_init_type_name(&hog->item, name,
  1079. &gpio_sim_hog_config_type);
  1080. hog->dir = GPIOD_IN;
  1081. hog->name = NULL;
  1082. hog->parent = line;
  1083. line->hog = hog;
  1084. mutex_unlock(&dev->lock);
  1085. return &hog->item;
  1086. }
  1087. static void gpio_sim_line_config_group_release(struct config_item *item)
  1088. {
  1089. struct gpio_sim_line *line = to_gpio_sim_line(item);
  1090. struct gpio_sim_device *dev = gpio_sim_line_get_device(line);
  1091. mutex_lock(&dev->lock);
  1092. list_del(&line->siblings);
  1093. mutex_unlock(&dev->lock);
  1094. kfree(line->name);
  1095. kfree(line);
  1096. }
  1097. static struct configfs_item_operations gpio_sim_line_config_item_ops = {
  1098. .release = gpio_sim_line_config_group_release,
  1099. };
  1100. static struct configfs_group_operations gpio_sim_line_config_group_ops = {
  1101. .make_item = gpio_sim_line_config_make_hog_item,
  1102. };
  1103. static const struct config_item_type gpio_sim_line_config_type = {
  1104. .ct_item_ops = &gpio_sim_line_config_item_ops,
  1105. .ct_group_ops = &gpio_sim_line_config_group_ops,
  1106. .ct_attrs = gpio_sim_line_config_attrs,
  1107. .ct_owner = THIS_MODULE,
  1108. };
  1109. static struct config_group *
  1110. gpio_sim_bank_config_make_line_group(struct config_group *group,
  1111. const char *name)
  1112. {
  1113. struct gpio_sim_bank *bank = to_gpio_sim_bank(&group->cg_item);
  1114. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  1115. struct gpio_sim_line *line;
  1116. unsigned int offset;
  1117. int ret, nchar;
  1118. ret = sscanf(name, "line%u%n", &offset, &nchar);
  1119. if (ret != 1 || nchar != strlen(name))
  1120. return ERR_PTR(-EINVAL);
  1121. mutex_lock(&dev->lock);
  1122. if (gpio_sim_device_is_live_unlocked(dev)) {
  1123. mutex_unlock(&dev->lock);
  1124. return ERR_PTR(-EBUSY);
  1125. }
  1126. line = kzalloc(sizeof(*line), GFP_KERNEL);
  1127. if (!line) {
  1128. mutex_unlock(&dev->lock);
  1129. return ERR_PTR(-ENOMEM);
  1130. }
  1131. config_group_init_type_name(&line->group, name,
  1132. &gpio_sim_line_config_type);
  1133. line->parent = bank;
  1134. line->offset = offset;
  1135. list_add_tail(&line->siblings, &bank->line_list);
  1136. mutex_unlock(&dev->lock);
  1137. return &line->group;
  1138. }
  1139. static void gpio_sim_bank_config_group_release(struct config_item *item)
  1140. {
  1141. struct gpio_sim_bank *bank = to_gpio_sim_bank(item);
  1142. struct gpio_sim_device *dev = gpio_sim_bank_get_device(bank);
  1143. mutex_lock(&dev->lock);
  1144. list_del(&bank->siblings);
  1145. mutex_unlock(&dev->lock);
  1146. kfree(bank->label);
  1147. kfree(bank);
  1148. }
  1149. static struct configfs_item_operations gpio_sim_bank_config_item_ops = {
  1150. .release = gpio_sim_bank_config_group_release,
  1151. };
  1152. static struct configfs_group_operations gpio_sim_bank_config_group_ops = {
  1153. .make_group = gpio_sim_bank_config_make_line_group,
  1154. };
  1155. static const struct config_item_type gpio_sim_bank_config_group_type = {
  1156. .ct_item_ops = &gpio_sim_bank_config_item_ops,
  1157. .ct_group_ops = &gpio_sim_bank_config_group_ops,
  1158. .ct_attrs = gpio_sim_bank_config_attrs,
  1159. .ct_owner = THIS_MODULE,
  1160. };
  1161. static struct config_group *
  1162. gpio_sim_device_config_make_bank_group(struct config_group *group,
  1163. const char *name)
  1164. {
  1165. struct gpio_sim_device *dev = to_gpio_sim_device(&group->cg_item);
  1166. struct gpio_sim_bank *bank;
  1167. mutex_lock(&dev->lock);
  1168. if (gpio_sim_device_is_live_unlocked(dev)) {
  1169. mutex_unlock(&dev->lock);
  1170. return ERR_PTR(-EBUSY);
  1171. }
  1172. bank = kzalloc(sizeof(*bank), GFP_KERNEL);
  1173. if (!bank) {
  1174. mutex_unlock(&dev->lock);
  1175. return ERR_PTR(-ENOMEM);
  1176. }
  1177. config_group_init_type_name(&bank->group, name,
  1178. &gpio_sim_bank_config_group_type);
  1179. bank->num_lines = 1;
  1180. bank->parent = dev;
  1181. INIT_LIST_HEAD(&bank->line_list);
  1182. list_add_tail(&bank->siblings, &dev->bank_list);
  1183. mutex_unlock(&dev->lock);
  1184. return &bank->group;
  1185. }
  1186. static void gpio_sim_device_config_group_release(struct config_item *item)
  1187. {
  1188. struct gpio_sim_device *dev = to_gpio_sim_device(item);
  1189. mutex_lock(&dev->lock);
  1190. if (gpio_sim_device_is_live_unlocked(dev))
  1191. gpio_sim_device_deactivate_unlocked(dev);
  1192. mutex_unlock(&dev->lock);
  1193. mutex_destroy(&dev->lock);
  1194. ida_free(&gpio_sim_ida, dev->id);
  1195. kfree(dev);
  1196. }
  1197. static struct configfs_item_operations gpio_sim_device_config_item_ops = {
  1198. .release = gpio_sim_device_config_group_release,
  1199. };
  1200. static struct configfs_group_operations gpio_sim_device_config_group_ops = {
  1201. .make_group = gpio_sim_device_config_make_bank_group,
  1202. };
  1203. static const struct config_item_type gpio_sim_device_config_group_type = {
  1204. .ct_item_ops = &gpio_sim_device_config_item_ops,
  1205. .ct_group_ops = &gpio_sim_device_config_group_ops,
  1206. .ct_attrs = gpio_sim_device_config_attrs,
  1207. .ct_owner = THIS_MODULE,
  1208. };
  1209. static struct config_group *
  1210. gpio_sim_config_make_device_group(struct config_group *group, const char *name)
  1211. {
  1212. struct gpio_sim_device *dev;
  1213. int id;
  1214. dev = kzalloc(sizeof(*dev), GFP_KERNEL);
  1215. if (!dev)
  1216. return ERR_PTR(-ENOMEM);
  1217. id = ida_alloc(&gpio_sim_ida, GFP_KERNEL);
  1218. if (id < 0) {
  1219. kfree(dev);
  1220. return ERR_PTR(id);
  1221. }
  1222. config_group_init_type_name(&dev->group, name,
  1223. &gpio_sim_device_config_group_type);
  1224. dev->id = id;
  1225. mutex_init(&dev->lock);
  1226. INIT_LIST_HEAD(&dev->bank_list);
  1227. dev->bus_notifier.notifier_call = gpio_sim_bus_notifier_call;
  1228. init_completion(&dev->probe_completion);
  1229. return &dev->group;
  1230. }
  1231. static struct configfs_group_operations gpio_sim_config_group_ops = {
  1232. .make_group = gpio_sim_config_make_device_group,
  1233. };
  1234. static const struct config_item_type gpio_sim_config_type = {
  1235. .ct_group_ops = &gpio_sim_config_group_ops,
  1236. .ct_owner = THIS_MODULE,
  1237. };
  1238. static struct configfs_subsystem gpio_sim_config_subsys = {
  1239. .su_group = {
  1240. .cg_item = {
  1241. .ci_namebuf = "gpio-sim",
  1242. .ci_type = &gpio_sim_config_type,
  1243. },
  1244. },
  1245. };
  1246. static int __init gpio_sim_init(void)
  1247. {
  1248. int ret;
  1249. ret = platform_driver_register(&gpio_sim_driver);
  1250. if (ret) {
  1251. pr_err("Error %d while registering the platform driver\n", ret);
  1252. return ret;
  1253. }
  1254. config_group_init(&gpio_sim_config_subsys.su_group);
  1255. mutex_init(&gpio_sim_config_subsys.su_mutex);
  1256. ret = configfs_register_subsystem(&gpio_sim_config_subsys);
  1257. if (ret) {
  1258. pr_err("Error %d while registering the configfs subsystem %s\n",
  1259. ret, gpio_sim_config_subsys.su_group.cg_item.ci_namebuf);
  1260. mutex_destroy(&gpio_sim_config_subsys.su_mutex);
  1261. platform_driver_unregister(&gpio_sim_driver);
  1262. return ret;
  1263. }
  1264. return 0;
  1265. }
  1266. module_init(gpio_sim_init);
  1267. static void __exit gpio_sim_exit(void)
  1268. {
  1269. configfs_unregister_subsystem(&gpio_sim_config_subsys);
  1270. mutex_destroy(&gpio_sim_config_subsys.su_mutex);
  1271. platform_driver_unregister(&gpio_sim_driver);
  1272. }
  1273. module_exit(gpio_sim_exit);
  1274. MODULE_AUTHOR("Bartosz Golaszewski <[email protected]");
  1275. MODULE_DESCRIPTION("GPIO Simulator Module");
  1276. MODULE_LICENSE("GPL");