adb.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:18k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * Device driver for the Apple Desktop Bus
  3.  * and the /dev/adb device on macintoshes.
  4.  *
  5.  * Copyright (C) 1996 Paul Mackerras.
  6.  *
  7.  * Modified to declare controllers as structures, added
  8.  * client notification of bus reset and handles PowerBook
  9.  * sleep, by Benjamin Herrenschmidt.
  10.  *
  11.  * To do:
  12.  *
  13.  * - /proc/adb to list the devices and infos
  14.  * - more /dev/adb to allow userland to receive the
  15.  *   flow of auto-polling datas from a given device.
  16.  * - move bus probe to a kernel thread
  17.  */
  18. #include <linux/config.h>
  19. #include <linux/types.h>
  20. #include <linux/errno.h>
  21. #include <linux/kernel.h>
  22. #include <linux/slab.h>
  23. #include <linux/module.h>
  24. #include <linux/fs.h>
  25. #include <linux/devfs_fs_kernel.h>
  26. #include <linux/mm.h>
  27. #include <linux/sched.h>
  28. #include <linux/smp_lock.h>
  29. #include <linux/adb.h>
  30. #include <linux/cuda.h>
  31. #include <linux/pmu.h>
  32. #include <linux/notifier.h>
  33. #include <linux/wait.h>
  34. #include <linux/init.h>
  35. #include <linux/delay.h>
  36. #include <linux/completion.h>
  37. #include <asm/uaccess.h>
  38. #ifdef CONFIG_PPC
  39. #include <asm/prom.h>
  40. #include <asm/hydra.h>
  41. #endif
  42. EXPORT_SYMBOL(adb_controller);
  43. EXPORT_SYMBOL(adb_client_list);
  44. extern struct adb_driver via_macii_driver;
  45. extern struct adb_driver via_maciisi_driver;
  46. extern struct adb_driver via_cuda_driver;
  47. extern struct adb_driver adb_iop_driver;
  48. extern struct adb_driver via_pmu_driver;
  49. extern struct adb_driver macio_adb_driver;
  50. static struct adb_driver *adb_driver_list[] = {
  51. #ifdef CONFIG_ADB_MACII
  52. &via_macii_driver,
  53. #endif
  54. #ifdef CONFIG_ADB_MACIISI
  55. &via_maciisi_driver,
  56. #endif
  57. #ifdef CONFIG_ADB_CUDA
  58. &via_cuda_driver,
  59. #endif
  60. #ifdef CONFIG_ADB_IOP
  61. &adb_iop_driver,
  62. #endif
  63. #if defined(CONFIG_ADB_PMU) || defined(CONFIG_ADB_PMU68K)
  64. &via_pmu_driver,
  65. #endif
  66. #ifdef CONFIG_ADB_MACIO
  67. &macio_adb_driver,
  68. #endif
  69. NULL
  70. };
  71. struct adb_driver *adb_controller;
  72. struct notifier_block *adb_client_list = NULL;
  73. static int adb_got_sleep = 0;
  74. static int adb_inited = 0;
  75. static pid_t adb_probe_task_pid;
  76. static DECLARE_MUTEX(adb_probe_mutex);
  77. static struct completion adb_probe_task_comp;
  78. static int sleepy_trackpad;
  79. int __adb_probe_sync;
  80. #ifdef CONFIG_PMAC_PBOOK
  81. static int adb_notify_sleep(struct pmu_sleep_notifier *self, int when);
  82. static struct pmu_sleep_notifier adb_sleep_notifier = {
  83. adb_notify_sleep,
  84. SLEEP_LEVEL_ADB,
  85. };
  86. #endif
  87. static int adb_scan_bus(void);
  88. static int do_adb_reset_bus(void);
  89. static void adbdev_init(void);
  90. static struct adb_handler {
  91. void (*handler)(unsigned char *, int, struct pt_regs *, int);
  92. int original_address;
  93. int handler_id;
  94. } adb_handler[16];
  95. #if 0
  96. static void printADBreply(struct adb_request *req)
  97. {
  98.         int i;
  99.         printk("adb reply (%d)", req->reply_len);
  100.         for(i = 0; i < req->reply_len; i++)
  101.                 printk(" %x", req->reply[i]);
  102.         printk("n");
  103. }
  104. #endif
  105. static __inline__ void adb_wait_ms(unsigned int ms)
  106. {
  107. if (current->pid && adb_probe_task_pid &&
  108.   adb_probe_task_pid == current->pid) {
  109. current->state = TASK_UNINTERRUPTIBLE;
  110. schedule_timeout(1 + ms * HZ / 1000);
  111. } else
  112. mdelay(ms);
  113. }
  114. static int adb_scan_bus(void)
  115. {
  116. int i, highFree=0, noMovement;
  117. int devmask = 0;
  118. struct adb_request req;
  119. /* assumes adb_handler[] is all zeroes at this point */
  120. for (i = 1; i < 16; i++) {
  121. /* see if there is anything at address i */
  122. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  123.                             (i << 4) | 0xf);
  124. if (req.reply_len > 1)
  125. /* one or more devices at this address */
  126. adb_handler[i].original_address = i;
  127. else if (i > highFree)
  128. highFree = i;
  129. }
  130. /* Note we reset noMovement to 0 each time we move a device */
  131. for (noMovement = 1; noMovement < 2 && highFree > 0; noMovement++) {
  132. for (i = 1; i < 16; i++) {
  133. if (adb_handler[i].original_address == 0)
  134. continue;
  135. /*
  136.  * Send a "talk register 3" command to address i
  137.  * to provoke a collision if there is more than
  138.  * one device at this address.
  139.  */
  140. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  141.     (i << 4) | 0xf);
  142. /*
  143.  * Move the device(s) which didn't detect a
  144.  * collision to address `highFree'.  Hopefully
  145.  * this only moves one device.
  146.  */
  147. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  148.     (i<< 4) | 0xb, (highFree | 0x60), 0xfe);
  149. /*
  150.  * See if anybody actually moved. This is suggested
  151.  * by HW TechNote 01:
  152.  *
  153.  * http://developer.apple.com/technotes/hw/hw_01.html
  154.  */
  155. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  156.     (highFree << 4) | 0xf);
  157. if (req.reply_len <= 1) continue;
  158. /*
  159.  * Test whether there are any device(s) left
  160.  * at address i.
  161.  */
  162. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  163.     (i << 4) | 0xf);
  164. if (req.reply_len > 1) {
  165. /*
  166.  * There are still one or more devices
  167.  * left at address i.  Register the one(s)
  168.  * we moved to `highFree', and find a new
  169.  * value for highFree.
  170.  */
  171. adb_handler[highFree].original_address =
  172. adb_handler[i].original_address;
  173. while (highFree > 0 &&
  174.        adb_handler[highFree].original_address)
  175. highFree--;
  176. if (highFree <= 0)
  177. break;
  178. noMovement = 0;
  179. }
  180. else {
  181. /*
  182.  * No devices left at address i; move the
  183.  * one(s) we moved to `highFree' back to i.
  184.  */
  185. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  186.     (highFree << 4) | 0xb,
  187.     (i | 0x60), 0xfe);
  188. }
  189. }
  190. }
  191. /* Now fill in the handler_id field of the adb_handler entries. */
  192. printk(KERN_DEBUG "adb devices:");
  193. for (i = 1; i < 16; i++) {
  194. if (adb_handler[i].original_address == 0)
  195. continue;
  196. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  197.     (i << 4) | 0xf);
  198. adb_handler[i].handler_id = req.reply[2];
  199. printk(" [%d]: %d %x", i, adb_handler[i].original_address,
  200.        adb_handler[i].handler_id);
  201. devmask |= 1 << i;
  202. }
  203. printk("n");
  204. return devmask;
  205. }
  206. /*
  207.  * This kernel task handles ADB probing. It dies once probing is
  208.  * completed.
  209.  */
  210. static int
  211. adb_probe_task(void *x)
  212. {
  213. strcpy(current->comm, "kadbprobe");
  214. spin_lock_irq(&current->sigmask_lock);
  215. sigfillset(&current->blocked);
  216. flush_signals(current);
  217. spin_unlock_irq(&current->sigmask_lock);
  218. printk(KERN_INFO "adb: starting probe task...n");
  219. do_adb_reset_bus();
  220. printk(KERN_INFO "adb: finished probe task...n");
  221. adb_probe_task_pid = 0;
  222. up(&adb_probe_mutex);
  223. return 0;
  224. }
  225. static void
  226. __adb_probe_task(void *data)
  227. {
  228. adb_probe_task_pid = kernel_thread(adb_probe_task, NULL,
  229. SIGCHLD | CLONE_FS | CLONE_FILES | CLONE_SIGHAND);
  230. }
  231. int
  232. adb_reset_bus(void)
  233. {
  234. static struct tq_struct tqs = {
  235. routine: __adb_probe_task,
  236. };
  237. if (__adb_probe_sync) {
  238. do_adb_reset_bus();
  239. return 0;
  240. }
  241. down(&adb_probe_mutex);
  242. /* Create probe thread as a child of keventd */
  243. if (current_is_keventd())
  244. __adb_probe_task(NULL);
  245. else
  246. schedule_task(&tqs);
  247. return 0;
  248. }
  249. int __init adb_init(void)
  250. {
  251. struct adb_driver *driver;
  252. int i;
  253. #ifdef CONFIG_PPC
  254. if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) )
  255. return 0;
  256. #endif
  257. #ifdef CONFIG_MAC
  258. if (!MACH_IS_MAC)
  259. return 0;
  260. #endif
  261. /* xmon may do early-init */
  262. if (adb_inited)
  263. return 0;
  264. adb_inited = 1;
  265. adb_controller = NULL;
  266. i = 0;
  267. while ((driver = adb_driver_list[i++]) != NULL) {
  268. if (!driver->probe()) {
  269. adb_controller = driver;
  270. break;
  271. }
  272. }
  273. if ((adb_controller == NULL) || adb_controller->init()) {
  274. printk(KERN_WARNING "Warning: no ADB interface detectedn");
  275. adb_controller = NULL;
  276. } else {
  277. #ifdef CONFIG_PMAC_PBOOK
  278. pmu_register_sleep_notifier(&adb_sleep_notifier);
  279. #endif /* CONFIG_PMAC_PBOOK */
  280. #ifdef CONFIG_PPC
  281. if (machine_is_compatible("AAPL,PowerBook1998") ||
  282. machine_is_compatible("PowerBook1,1"))
  283. sleepy_trackpad = 1;
  284. #endif /* CONFIG_PPC */
  285. init_completion(&adb_probe_task_comp);
  286. adbdev_init();
  287. adb_reset_bus();
  288. }
  289. return 0;
  290. }
  291. __initcall(adb_init);
  292. #ifdef CONFIG_PMAC_PBOOK
  293. /*
  294.  * notify clients before sleep and reset bus afterwards
  295.  */
  296. int
  297. adb_notify_sleep(struct pmu_sleep_notifier *self, int when)
  298. {
  299. int ret;
  300. switch (when) {
  301. case PBOOK_SLEEP_REQUEST:
  302. adb_got_sleep = 1;
  303. /* We need to get a lock on the probe thread */
  304. down(&adb_probe_mutex);
  305. /* Stop autopoll */
  306. if (adb_controller->autopoll)
  307. adb_controller->autopoll(0);
  308. ret = notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
  309. if (ret & NOTIFY_STOP_MASK) {
  310. up(&adb_probe_mutex);
  311. return PBOOK_SLEEP_REFUSE;
  312. }
  313. break;
  314. case PBOOK_SLEEP_REJECT:
  315. if (adb_got_sleep) {
  316. adb_got_sleep = 0;
  317. up(&adb_probe_mutex);
  318. adb_reset_bus();
  319. }
  320. break;
  321. case PBOOK_SLEEP_NOW:
  322. break;
  323. case PBOOK_WAKE:
  324. adb_got_sleep = 0;
  325. up(&adb_probe_mutex);
  326. adb_reset_bus();
  327. break;
  328. }
  329. return PBOOK_SLEEP_OK;
  330. }
  331. #endif /* CONFIG_PMAC_PBOOK */
  332. static int
  333. do_adb_reset_bus(void)
  334. {
  335. int ret, nret, devs;
  336. unsigned long flags;
  337. if (adb_controller == NULL)
  338. return -ENXIO;
  339. if (adb_controller->autopoll)
  340. adb_controller->autopoll(0);
  341. nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL);
  342. if (nret & NOTIFY_STOP_MASK) {
  343. if (adb_controller->autopoll)
  344. adb_controller->autopoll(devs);
  345. return -EBUSY;
  346. }
  347. if (sleepy_trackpad) {
  348. /* Let the trackpad settle down */
  349. adb_wait_ms(500);
  350. }
  351. save_flags(flags);
  352. cli();
  353. memset(adb_handler, 0, sizeof(adb_handler));
  354. restore_flags(flags);
  355. /* That one is still a bit synchronous, oh well... */
  356. if (adb_controller->reset_bus)
  357. ret = adb_controller->reset_bus();
  358. else
  359. ret = 0;
  360. if (sleepy_trackpad) {
  361. /* Let the trackpad settle down */
  362. adb_wait_ms(1500);
  363. }
  364. if (!ret) {
  365. devs = adb_scan_bus();
  366. if (adb_controller->autopoll)
  367. adb_controller->autopoll(devs);
  368. }
  369. nret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL);
  370. if (nret & NOTIFY_STOP_MASK)
  371. return -EBUSY;
  372. return ret;
  373. }
  374. void
  375. adb_poll(void)
  376. {
  377. if ((adb_controller == NULL)||(adb_controller->poll == NULL))
  378. return;
  379. adb_controller->poll();
  380. }
  381. static void
  382. adb_probe_wakeup(struct adb_request *req)
  383. {
  384. complete(&adb_probe_task_comp);
  385. }
  386. static struct adb_request adb_sreq;
  387. static int adb_sreq_lock; // Use semaphore ! */ 
  388. int
  389. adb_request(struct adb_request *req, void (*done)(struct adb_request *),
  390.     int flags, int nbytes, ...)
  391. {
  392. va_list list;
  393. int i, use_sreq;
  394. int rc;
  395. if ((adb_controller == NULL) || (adb_controller->send_request == NULL))
  396. return -ENXIO;
  397. if (nbytes < 1)
  398. return -EINVAL;
  399. if (req == NULL && (flags & ADBREQ_NOSEND))
  400. return -EINVAL;
  401. if (req == NULL) {
  402. if (test_and_set_bit(0,&adb_sreq_lock)) {
  403. printk("adb.c: Warning: contention on static request !n");
  404. return -EPERM;
  405. }
  406. req = &adb_sreq;
  407. flags |= ADBREQ_SYNC;
  408. use_sreq = 1;
  409. } else
  410. use_sreq = 0;
  411. req->nbytes = nbytes+1;
  412. req->done = done;
  413. req->reply_expected = flags & ADBREQ_REPLY;
  414. req->data[0] = ADB_PACKET;
  415. va_start(list, nbytes);
  416. for (i = 0; i < nbytes; ++i)
  417. req->data[i+1] = va_arg(list, int);
  418. va_end(list);
  419. if (flags & ADBREQ_NOSEND)
  420. return 0;
  421. /* Synchronous requests send from the probe thread cause it to
  422.  * block. Beware that the "done" callback will be overriden !
  423.  */
  424. if ((flags & ADBREQ_SYNC) &&
  425.     (current->pid && adb_probe_task_pid &&
  426.     adb_probe_task_pid == current->pid)) {
  427. req->done = adb_probe_wakeup;
  428. rc = adb_controller->send_request(req, 0);
  429. if (rc || req->complete)
  430. goto bail;
  431. wait_for_completion(&adb_probe_task_comp);
  432. rc = 0;
  433. goto bail;
  434. }
  435. rc = adb_controller->send_request(req, flags & ADBREQ_SYNC);
  436. bail:
  437. if (use_sreq)
  438. clear_bit(0, &adb_sreq_lock);
  439. return rc;
  440. }
  441.  /* Ultimately this should return the number of devices with
  442.     the given default id.
  443.     And it does it now ! Note: changed behaviour: This function
  444.     will now register if default_id _and_ handler_id both match
  445.     but handler_id can be left to 0 to match with default_id only.
  446.     When handler_id is set, this function will try to adjust
  447.     the handler_id id it doesn't match. */
  448. int
  449. adb_register(int default_id, int handler_id, struct adb_ids *ids,
  450.      void (*handler)(unsigned char *, int, struct pt_regs *, int))
  451. {
  452. int i;
  453. ids->nids = 0;
  454. for (i = 1; i < 16; i++) {
  455. if ((adb_handler[i].original_address == default_id) &&
  456.     (!handler_id || (handler_id == adb_handler[i].handler_id) || 
  457.     adb_try_handler_change(i, handler_id))) {
  458. if (adb_handler[i].handler != 0) {
  459. printk(KERN_ERR
  460.        "Two handlers for ADB device %dn",
  461.        default_id);
  462. continue;
  463. }
  464. adb_handler[i].handler = handler;
  465. ids->id[ids->nids++] = i;
  466. }
  467. }
  468. return ids->nids;
  469. }
  470. int
  471. adb_unregister(int index)
  472. {
  473. if (!adb_handler[index].handler)
  474. return -ENODEV;
  475. adb_handler[index].handler = 0;
  476. return 0;
  477. }
  478. void
  479. adb_input(unsigned char *buf, int nb, struct pt_regs *regs, int autopoll)
  480. {
  481. int i, id;
  482. static int dump_adb_input = 0;
  483. /* We skip keystrokes and mouse moves when the sleep process
  484.  * has been started. We stop autopoll, but this is another security
  485.  */
  486. if (adb_got_sleep)
  487. return;
  488. id = buf[0] >> 4;
  489. if (dump_adb_input) {
  490. printk(KERN_INFO "adb packet: ");
  491. for (i = 0; i < nb; ++i)
  492. printk(" %x", buf[i]);
  493. printk(", id = %dn", id);
  494. }
  495. if (adb_handler[id].handler != 0) {
  496. (*adb_handler[id].handler)(buf, nb, regs, autopoll);
  497. }
  498. }
  499. /* Try to change handler to new_id. Will return 1 if successful */
  500. int
  501. adb_try_handler_change(int address, int new_id)
  502. {
  503. struct adb_request req;
  504. if (adb_handler[address].handler_id == new_id)
  505.     return 1;
  506. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  507.     ADB_WRITEREG(address, 3), address | 0x20, new_id);
  508. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  509.     ADB_READREG(address, 3));
  510. if (req.reply_len < 2)
  511.     return 0;
  512. if (req.reply[2] != new_id)
  513.     return 0;
  514. adb_handler[address].handler_id = req.reply[2];
  515. return 1;
  516. }
  517. int
  518. adb_get_infos(int address, int *original_address, int *handler_id)
  519. {
  520. *original_address = adb_handler[address].original_address;
  521. *handler_id = adb_handler[address].handler_id;
  522. return (*original_address != 0);
  523. }
  524. /*
  525.  * /dev/adb device driver.
  526.  */
  527. #define ADB_MAJOR 56 /* major number for /dev/adb */
  528. struct adbdev_state {
  529. spinlock_t lock;
  530. atomic_t n_pending;
  531. struct adb_request *completed;
  532.    wait_queue_head_t wait_queue;
  533. int inuse;
  534. };
  535. static void adb_write_done(struct adb_request *req)
  536. {
  537. struct adbdev_state *state = (struct adbdev_state *) req->arg;
  538. unsigned long flags;
  539. if (!req->complete) {
  540. req->reply_len = 0;
  541. req->complete = 1;
  542. }
  543. spin_lock_irqsave(&state->lock, flags);
  544. atomic_dec(&state->n_pending);
  545. if (!state->inuse) {
  546. kfree(req);
  547. if (atomic_read(&state->n_pending) == 0) {
  548. spin_unlock_irqrestore(&state->lock, flags);
  549. kfree(state);
  550. return;
  551. }
  552. } else {
  553. struct adb_request **ap = &state->completed;
  554. while (*ap != NULL)
  555. ap = &(*ap)->next;
  556. req->next = NULL;
  557. *ap = req;
  558. wake_up_interruptible(&state->wait_queue);
  559. }
  560. spin_unlock_irqrestore(&state->lock, flags);
  561. }
  562. static int adb_open(struct inode *inode, struct file *file)
  563. {
  564. struct adbdev_state *state;
  565. if (MINOR(inode->i_rdev) > 0 || adb_controller == NULL)
  566. return -ENXIO;
  567. state = kmalloc(sizeof(struct adbdev_state), GFP_KERNEL);
  568. if (state == 0)
  569. return -ENOMEM;
  570. file->private_data = state;
  571. spin_lock_init(&state->lock);
  572. atomic_set(&state->n_pending, 0);
  573. state->completed = NULL;
  574. init_waitqueue_head(&state->wait_queue);
  575. state->inuse = 1;
  576. return 0;
  577. }
  578. static int adb_release(struct inode *inode, struct file *file)
  579. {
  580. struct adbdev_state *state = file->private_data;
  581. unsigned long flags;
  582. lock_kernel();
  583. if (state) {
  584. file->private_data = NULL;
  585. spin_lock_irqsave(&state->lock, flags);
  586. if (atomic_read(&state->n_pending) == 0
  587.     && state->completed == NULL) {
  588. spin_unlock_irqrestore(&state->lock, flags);
  589. kfree(state);
  590. } else {
  591. state->inuse = 0;
  592. spin_unlock_irqrestore(&state->lock, flags);
  593. }
  594. }
  595. unlock_kernel();
  596. return 0;
  597. }
  598. static ssize_t adb_read(struct file *file, char *buf,
  599. size_t count, loff_t *ppos)
  600. {
  601. int ret;
  602. struct adbdev_state *state = file->private_data;
  603. struct adb_request *req;
  604. wait_queue_t wait = __WAITQUEUE_INITIALIZER(wait,current);
  605. unsigned long flags;
  606. if (count < 2)
  607. return -EINVAL;
  608. if (count > sizeof(req->reply))
  609. count = sizeof(req->reply);
  610. ret = verify_area(VERIFY_WRITE, buf, count);
  611. if (ret)
  612. return ret;
  613. req = NULL;
  614. spin_lock_irqsave(&state->lock, flags);
  615. add_wait_queue(&state->wait_queue, &wait);
  616. current->state = TASK_INTERRUPTIBLE;
  617. for (;;) {
  618. req = state->completed;
  619. if (req != NULL)
  620. state->completed = req->next;
  621. else if (atomic_read(&state->n_pending) == 0)
  622. ret = -EIO;
  623. if (req != NULL || ret != 0)
  624. break;
  625. if (file->f_flags & O_NONBLOCK) {
  626. ret = -EAGAIN;
  627. break;
  628. }
  629. if (signal_pending(current)) {
  630. ret = -ERESTARTSYS;
  631. break;
  632. }
  633. spin_unlock_irqrestore(&state->lock, flags);
  634. schedule();
  635. spin_lock_irqsave(&state->lock, flags);
  636. }
  637. current->state = TASK_RUNNING;
  638. remove_wait_queue(&state->wait_queue, &wait);
  639. spin_unlock_irqrestore(&state->lock, flags);
  640. if (ret)
  641. return ret;
  642. ret = req->reply_len;
  643. if (ret > count)
  644. ret = count;
  645. if (ret > 0 && copy_to_user(buf, req->reply, ret))
  646. ret = -EFAULT;
  647. kfree(req);
  648. return ret;
  649. }
  650. static ssize_t adb_write(struct file *file, const char *buf,
  651.  size_t count, loff_t *ppos)
  652. {
  653. int ret/*, i*/;
  654. struct adbdev_state *state = file->private_data;
  655. struct adb_request *req;
  656. if (count < 2 || count > sizeof(req->data))
  657. return -EINVAL;
  658. if (adb_controller == NULL)
  659. return -ENXIO;
  660. ret = verify_area(VERIFY_READ, buf, count);
  661. if (ret)
  662. return ret;
  663. req = (struct adb_request *) kmalloc(sizeof(struct adb_request),
  664.      GFP_KERNEL);
  665. if (req == NULL)
  666. return -ENOMEM;
  667. req->nbytes = count;
  668. req->done = adb_write_done;
  669. req->arg = (void *) state;
  670. req->complete = 0;
  671. ret = -EFAULT;
  672. if (copy_from_user(req->data, buf, count))
  673. goto out;
  674. atomic_inc(&state->n_pending);
  675. /* If a probe is in progress or we are sleeping, wait for it to complete */
  676. down(&adb_probe_mutex);
  677. /* Special case for ADB_BUSRESET request, all others are sent to
  678.    the controller */
  679. if ((req->data[0] == ADB_PACKET)&&(count > 1)
  680. &&(req->data[1] == ADB_BUSRESET)) {
  681. ret = do_adb_reset_bus();
  682. up(&adb_probe_mutex);
  683. atomic_dec(&state->n_pending);
  684. if (ret == 0)
  685. ret = count;
  686. goto out;
  687. } else {
  688. req->reply_expected = ((req->data[1] & 0xc) == 0xc);
  689. if (adb_controller && adb_controller->send_request)
  690. ret = adb_controller->send_request(req, 0);
  691. else
  692. ret = -ENXIO;
  693. up(&adb_probe_mutex);
  694. }
  695. if (ret != 0) {
  696. atomic_dec(&state->n_pending);
  697. goto out;
  698. }
  699. return count;
  700. out:
  701. kfree(req);
  702. return ret;
  703. }
  704. static struct file_operations adb_fops = {
  705. llseek: no_llseek,
  706. read: adb_read,
  707. write: adb_write,
  708. open: adb_open,
  709. release: adb_release,
  710. };
  711. static void
  712. adbdev_init(void)
  713. {
  714. if (devfs_register_chrdev(ADB_MAJOR, "adb", &adb_fops))
  715. printk(KERN_ERR "adb: unable to get major %dn", ADB_MAJOR);
  716. else
  717. devfs_register (NULL, "adb", DEVFS_FL_DEFAULT,
  718. ADB_MAJOR, 0,
  719. S_IFCHR | S_IRUSR | S_IWUSR,
  720. &adb_fops, NULL);
  721. }