adb.c
上传用户:lgb322
上传日期:2013-02-24
资源大小:30529k
文件大小:19k
源码类别:

嵌入式Linux

开发平台:

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. #ifdef CONFIG_ADB_PMU
  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 int adb_probe_task_flag;
  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. clear_bit(0, &adb_probe_task_flag);
  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. /* We need to get a lock on the probe thread */
  242. while (test_and_set_bit(0, &adb_probe_task_flag))
  243. schedule();
  244. /* Just wait for PID to be 0 just in case (possible race) */
  245. while (adb_probe_task_pid != 0)
  246. schedule();
  247. /* Create probe thread as a child of keventd */
  248. if (current_is_keventd())
  249. __adb_probe_task(NULL);
  250. else
  251. schedule_task(&tqs);
  252. return 0;
  253. }
  254. int __init adb_init(void)
  255. {
  256. struct adb_driver *driver;
  257. int i;
  258. #ifdef CONFIG_PPC
  259. if ( (_machine != _MACH_chrp) && (_machine != _MACH_Pmac) )
  260. return 0;
  261. #endif
  262. #ifdef CONFIG_MAC
  263. if (!MACH_IS_MAC)
  264. return 0;
  265. #endif
  266. /* xmon may do early-init */
  267. if (adb_inited)
  268. return 0;
  269. adb_inited = 1;
  270. adb_controller = NULL;
  271. i = 0;
  272. while ((driver = adb_driver_list[i++]) != NULL) {
  273. if (!driver->probe()) {
  274. adb_controller = driver;
  275. break;
  276. }
  277. }
  278. if ((adb_controller == NULL) || adb_controller->init()) {
  279. printk(KERN_WARNING "Warning: no ADB interface detectedn");
  280. adb_controller = NULL;
  281. } else {
  282. #ifdef CONFIG_PMAC_PBOOK
  283. pmu_register_sleep_notifier(&adb_sleep_notifier);
  284. #endif /* CONFIG_PMAC_PBOOK */
  285. if (machine_is_compatible("AAPL,PowerBook1998") ||
  286. machine_is_compatible("PowerBook1,1"))
  287. sleepy_trackpad = 1;
  288. init_completion(&adb_probe_task_comp);
  289. adbdev_init();
  290. adb_reset_bus();
  291. }
  292. return 0;
  293. }
  294. __initcall(adb_init);
  295. #ifdef CONFIG_PMAC_PBOOK
  296. /*
  297.  * notify clients before sleep and reset bus afterwards
  298.  */
  299. int
  300. adb_notify_sleep(struct pmu_sleep_notifier *self, int when)
  301. {
  302. int ret;
  303. switch (when) {
  304. case PBOOK_SLEEP_REQUEST:
  305. adb_got_sleep = 1;
  306. /* We need to get a lock on the probe thread */
  307. while (test_and_set_bit(0, &adb_probe_task_flag))
  308. schedule();
  309. /* Just wait for PID to be 0 just in case (possible race) */
  310. while (adb_probe_task_pid != 0)
  311. schedule();
  312. if (adb_controller->autopoll)
  313. adb_controller->autopoll(0);
  314. ret = notifier_call_chain(&adb_client_list, ADB_MSG_POWERDOWN, NULL);
  315. if (ret & NOTIFY_STOP_MASK)
  316. return PBOOK_SLEEP_REFUSE;
  317. break;
  318. case PBOOK_SLEEP_REJECT:
  319. if (adb_got_sleep) {
  320. adb_got_sleep = 0;
  321. clear_bit(0, &adb_probe_task_flag);
  322. adb_reset_bus();
  323. }
  324. break;
  325. case PBOOK_SLEEP_NOW:
  326. break;
  327. case PBOOK_WAKE:
  328. adb_got_sleep = 0;
  329. clear_bit(0, &adb_probe_task_flag);
  330. adb_reset_bus();
  331. break;
  332. }
  333. return PBOOK_SLEEP_OK;
  334. }
  335. #endif /* CONFIG_PMAC_PBOOK */
  336. static int
  337. do_adb_reset_bus(void)
  338. {
  339. int ret, nret, devs;
  340. unsigned long flags;
  341. if (adb_controller == NULL)
  342. return -ENXIO;
  343. if (adb_controller->autopoll)
  344. adb_controller->autopoll(0);
  345. nret = notifier_call_chain(&adb_client_list, ADB_MSG_PRE_RESET, NULL);
  346. if (nret & NOTIFY_STOP_MASK) {
  347. if (adb_controller->autopoll)
  348. adb_controller->autopoll(devs);
  349. return -EBUSY;
  350. }
  351. if (sleepy_trackpad) {
  352. /* Let the trackpad settle down */
  353. adb_wait_ms(500);
  354. }
  355. save_flags(flags);
  356. cli();
  357. memset(adb_handler, 0, sizeof(adb_handler));
  358. restore_flags(flags);
  359. /* That one is still a bit synchronous, oh well... */
  360. if (adb_controller->reset_bus)
  361. ret = adb_controller->reset_bus();
  362. else
  363. ret = 0;
  364. if (sleepy_trackpad) {
  365. /* Let the trackpad settle down */
  366. adb_wait_ms(1500);
  367. }
  368. if (!ret) {
  369. devs = adb_scan_bus();
  370. if (adb_controller->autopoll)
  371. adb_controller->autopoll(devs);
  372. }
  373. nret = notifier_call_chain(&adb_client_list, ADB_MSG_POST_RESET, NULL);
  374. if (nret & NOTIFY_STOP_MASK)
  375. return -EBUSY;
  376. return ret;
  377. }
  378. void
  379. adb_poll(void)
  380. {
  381. if ((adb_controller == NULL)||(adb_controller->poll == NULL))
  382. return;
  383. adb_controller->poll();
  384. }
  385. static void
  386. adb_probe_wakeup(struct adb_request *req)
  387. {
  388. complete(&adb_probe_task_comp);
  389. }
  390. static struct adb_request adb_sreq;
  391. static int adb_sreq_lock; // Use semaphore ! */ 
  392. int
  393. adb_request(struct adb_request *req, void (*done)(struct adb_request *),
  394.     int flags, int nbytes, ...)
  395. {
  396. va_list list;
  397. int i, use_sreq;
  398. int rc;
  399. if ((adb_controller == NULL) || (adb_controller->send_request == NULL))
  400. return -ENXIO;
  401. if (nbytes < 1)
  402. return -EINVAL;
  403. if (req == NULL && (flags & ADBREQ_NOSEND))
  404. return -EINVAL;
  405. if (req == NULL) {
  406. if (test_and_set_bit(0,&adb_sreq_lock)) {
  407. printk("adb.c: Warning: contention on static request !n");
  408. return -EPERM;
  409. }
  410. req = &adb_sreq;
  411. flags |= ADBREQ_SYNC;
  412. use_sreq = 1;
  413. } else
  414. use_sreq = 0;
  415. req->nbytes = nbytes+1;
  416. req->done = done;
  417. req->reply_expected = flags & ADBREQ_REPLY;
  418. req->data[0] = ADB_PACKET;
  419. va_start(list, nbytes);
  420. for (i = 0; i < nbytes; ++i)
  421. req->data[i+1] = va_arg(list, int);
  422. va_end(list);
  423. if (flags & ADBREQ_NOSEND)
  424. return 0;
  425. /* Synchronous requests send from the probe thread cause it to
  426.  * block. Beware that the "done" callback will be overriden !
  427.  */
  428. if ((flags & ADBREQ_SYNC) &&
  429.     (current->pid && adb_probe_task_pid &&
  430.     adb_probe_task_pid == current->pid)) {
  431. req->done = adb_probe_wakeup;
  432. rc = adb_controller->send_request(req, 0);
  433. if (rc || req->complete)
  434. goto bail;
  435. wait_for_completion(&adb_probe_task_comp);
  436. rc = 0;
  437. goto bail;
  438. }
  439. rc = adb_controller->send_request(req, flags & ADBREQ_SYNC);
  440. bail:
  441. if (use_sreq)
  442. clear_bit(0, &adb_sreq_lock);
  443. return rc;
  444. }
  445.  /* Ultimately this should return the number of devices with
  446.     the given default id.
  447.     And it does it now ! Note: changed behaviour: This function
  448.     will now register if default_id _and_ handler_id both match
  449.     but handler_id can be left to 0 to match with default_id only.
  450.     When handler_id is set, this function will try to adjust
  451.     the handler_id id it doesn't match. */
  452. int
  453. adb_register(int default_id, int handler_id, struct adb_ids *ids,
  454.      void (*handler)(unsigned char *, int, struct pt_regs *, int))
  455. {
  456. int i;
  457. ids->nids = 0;
  458. for (i = 1; i < 16; i++) {
  459. if ((adb_handler[i].original_address == default_id) &&
  460.     (!handler_id || (handler_id == adb_handler[i].handler_id) || 
  461.     adb_try_handler_change(i, handler_id))) {
  462. if (adb_handler[i].handler != 0) {
  463. printk(KERN_ERR
  464.        "Two handlers for ADB device %dn",
  465.        default_id);
  466. continue;
  467. }
  468. adb_handler[i].handler = handler;
  469. ids->id[ids->nids++] = i;
  470. }
  471. }
  472. return ids->nids;
  473. }
  474. int
  475. adb_unregister(int index)
  476. {
  477. if (!adb_handler[index].handler)
  478. return -ENODEV;
  479. adb_handler[index].handler = 0;
  480. return 0;
  481. }
  482. void
  483. adb_input(unsigned char *buf, int nb, struct pt_regs *regs, int autopoll)
  484. {
  485. int i, id;
  486. static int dump_adb_input = 0;
  487. /* We skip keystrokes and mouse moves when the sleep process
  488.  * has been started. We stop autopoll, but this is another security
  489.  */
  490. if (adb_got_sleep)
  491. return;
  492. id = buf[0] >> 4;
  493. if (dump_adb_input) {
  494. printk(KERN_INFO "adb packet: ");
  495. for (i = 0; i < nb; ++i)
  496. printk(" %x", buf[i]);
  497. printk(", id = %dn", id);
  498. }
  499. if (adb_handler[id].handler != 0) {
  500. (*adb_handler[id].handler)(buf, nb, regs, autopoll);
  501. }
  502. }
  503. /* Try to change handler to new_id. Will return 1 if successful */
  504. int
  505. adb_try_handler_change(int address, int new_id)
  506. {
  507. struct adb_request req;
  508. if (adb_handler[address].handler_id == new_id)
  509.     return 1;
  510. adb_request(&req, NULL, ADBREQ_SYNC, 3,
  511.     ADB_WRITEREG(address, 3), address | 0x20, new_id);
  512. adb_request(&req, NULL, ADBREQ_SYNC | ADBREQ_REPLY, 1,
  513.     ADB_READREG(address, 3));
  514. if (req.reply_len < 2)
  515.     return 0;
  516. if (req.reply[2] != new_id)
  517.     return 0;
  518. adb_handler[address].handler_id = req.reply[2];
  519. return 1;
  520. }
  521. int
  522. adb_get_infos(int address, int *original_address, int *handler_id)
  523. {
  524. *original_address = adb_handler[address].original_address;
  525. *handler_id = adb_handler[address].handler_id;
  526. return (*original_address != 0);
  527. }
  528. /*
  529.  * /dev/adb device driver.
  530.  */
  531. #define ADB_MAJOR 56 /* major number for /dev/adb */
  532. struct adbdev_state {
  533. spinlock_t lock;
  534. atomic_t n_pending;
  535. struct adb_request *completed;
  536.    wait_queue_head_t wait_queue;
  537. int inuse;
  538. };
  539. static void adb_write_done(struct adb_request *req)
  540. {
  541. struct adbdev_state *state = (struct adbdev_state *) req->arg;
  542. unsigned long flags;
  543. if (!req->complete) {
  544. req->reply_len = 0;
  545. req->complete = 1;
  546. }
  547. spin_lock_irqsave(&state->lock, flags);
  548. atomic_dec(&state->n_pending);
  549. if (!state->inuse) {
  550. kfree(req);
  551. if (atomic_read(&state->n_pending) == 0) {
  552. spin_unlock_irqrestore(&state->lock, flags);
  553. kfree(state);
  554. return;
  555. }
  556. } else {
  557. struct adb_request **ap = &state->completed;
  558. while (*ap != NULL)
  559. ap = &(*ap)->next;
  560. req->next = NULL;
  561. *ap = req;
  562. wake_up_interruptible(&state->wait_queue);
  563. }
  564. spin_unlock_irqrestore(&state->lock, flags);
  565. }
  566. static int adb_open(struct inode *inode, struct file *file)
  567. {
  568. struct adbdev_state *state;
  569. if (MINOR(inode->i_rdev) > 0 || adb_controller == NULL)
  570. return -ENXIO;
  571. state = kmalloc(sizeof(struct adbdev_state), GFP_KERNEL);
  572. if (state == 0)
  573. return -ENOMEM;
  574. file->private_data = state;
  575. spin_lock_init(&state->lock);
  576. atomic_set(&state->n_pending, 0);
  577. state->completed = NULL;
  578. init_waitqueue_head(&state->wait_queue);
  579. state->inuse = 1;
  580. return 0;
  581. }
  582. static int adb_release(struct inode *inode, struct file *file)
  583. {
  584. struct adbdev_state *state = file->private_data;
  585. unsigned long flags;
  586. lock_kernel();
  587. if (state) {
  588. file->private_data = NULL;
  589. spin_lock_irqsave(&state->lock, flags);
  590. if (atomic_read(&state->n_pending) == 0
  591.     && state->completed == NULL) {
  592. spin_unlock_irqrestore(&state->lock, flags);
  593. kfree(state);
  594. } else {
  595. state->inuse = 0;
  596. spin_unlock_irqrestore(&state->lock, flags);
  597. }
  598. }
  599. unlock_kernel();
  600. return 0;
  601. }
  602. static ssize_t adb_read(struct file *file, char *buf,
  603. size_t count, loff_t *ppos)
  604. {
  605. int ret;
  606. struct adbdev_state *state = file->private_data;
  607. struct adb_request *req;
  608. wait_queue_t wait = __WAITQUEUE_INITIALIZER(wait,current);
  609. unsigned long flags;
  610. if (count < 2)
  611. return -EINVAL;
  612. if (count > sizeof(req->reply))
  613. count = sizeof(req->reply);
  614. ret = verify_area(VERIFY_WRITE, buf, count);
  615. if (ret)
  616. return ret;
  617. req = NULL;
  618. spin_lock_irqsave(&state->lock, flags);
  619. add_wait_queue(&state->wait_queue, &wait);
  620. current->state = TASK_INTERRUPTIBLE;
  621. for (;;) {
  622. req = state->completed;
  623. if (req != NULL)
  624. state->completed = req->next;
  625. else if (atomic_read(&state->n_pending) == 0)
  626. ret = -EIO;
  627. if (req != NULL || ret != 0)
  628. break;
  629. if (file->f_flags & O_NONBLOCK) {
  630. ret = -EAGAIN;
  631. break;
  632. }
  633. if (signal_pending(current)) {
  634. ret = -ERESTARTSYS;
  635. break;
  636. }
  637. spin_unlock_irqrestore(&state->lock, flags);
  638. schedule();
  639. spin_lock_irqsave(&state->lock, flags);
  640. }
  641. current->state = TASK_RUNNING;
  642. remove_wait_queue(&state->wait_queue, &wait);
  643. spin_unlock_irqrestore(&state->lock, flags);
  644. if (ret)
  645. return ret;
  646. ret = req->reply_len;
  647. if (ret > count)
  648. ret = count;
  649. if (ret > 0 && copy_to_user(buf, req->reply, ret))
  650. ret = -EFAULT;
  651. kfree(req);
  652. return ret;
  653. }
  654. static ssize_t adb_write(struct file *file, const char *buf,
  655.  size_t count, loff_t *ppos)
  656. {
  657. int ret/*, i*/;
  658. struct adbdev_state *state = file->private_data;
  659. struct adb_request *req;
  660. if (count < 2 || count > sizeof(req->data))
  661. return -EINVAL;
  662. if (adb_controller == NULL)
  663. return -ENXIO;
  664. ret = verify_area(VERIFY_READ, buf, count);
  665. if (ret)
  666. return ret;
  667. req = (struct adb_request *) kmalloc(sizeof(struct adb_request),
  668.      GFP_KERNEL);
  669. if (req == NULL)
  670. return -ENOMEM;
  671. req->nbytes = count;
  672. req->done = adb_write_done;
  673. req->arg = (void *) state;
  674. req->complete = 0;
  675. ret = -EFAULT;
  676. if (copy_from_user(req->data, buf, count))
  677. goto out;
  678. atomic_inc(&state->n_pending);
  679. /* If a probe is in progress, wait for it to complete */
  680. while (adb_probe_task_pid != 0 || test_bit(0, &adb_probe_task_flag))
  681. schedule();
  682. /* Special case for ADB_BUSRESET request, all others are sent to
  683.    the controller */
  684. if ((req->data[0] == ADB_PACKET)&&(count > 1)
  685. &&(req->data[1] == ADB_BUSRESET)) {
  686. ret = do_adb_reset_bus();
  687. atomic_dec(&state->n_pending);
  688. if (ret == 0)
  689. ret = count;
  690. goto out;
  691. } else {
  692. req->reply_expected = ((req->data[1] & 0xc) == 0xc);
  693. if (adb_controller && adb_controller->send_request)
  694. ret = adb_controller->send_request(req, 0);
  695. else
  696. ret = -ENXIO;
  697. }
  698. if (ret != 0) {
  699. atomic_dec(&state->n_pending);
  700. goto out;
  701. }
  702. return count;
  703. out:
  704. kfree(req);
  705. return ret;
  706. }
  707. static struct file_operations adb_fops = {
  708. llseek: no_llseek,
  709. read: adb_read,
  710. write: adb_write,
  711. open: adb_open,
  712. release: adb_release,
  713. };
  714. static void
  715. adbdev_init(void)
  716. {
  717. if (devfs_register_chrdev(ADB_MAJOR, "adb", &adb_fops))
  718. printk(KERN_ERR "adb: unable to get major %dn", ADB_MAJOR);
  719. else
  720. devfs_register (NULL, "adb", DEVFS_FL_DEFAULT,
  721. ADB_MAJOR, 0,
  722. S_IFCHR | S_IRUSR | S_IWUSR,
  723. &adb_fops, NULL);
  724. }