danielhilst

spi-sync-irqsafe.c

Sep 8th, 2015
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.31 KB | None | 0 0
  1. static void mcp23s17_read_irqsafe_complete(void *context)
  2. {
  3. struct mcp23s08 *mcp = context;
  4. spin_unlock_irqrestore(&mcp->slock, mcp->irq_flags);
  5. }
  6.  
  7. static int mcp23s17_read_irqsafe(struct mcp23s08 *mcp, unsigned reg)
  8. {
  9. unsigned long flags;
  10. struct spi_device *spi = mcp->data;
  11. struct spi_transfer t[2] = {
  12. [0] = {
  13. .tx_buf = mcp->tx,
  14. .len = 2,
  15. },
  16. [1] = {
  17. .rx_buf = mcp->rx,
  18. .len = 2,
  19. },
  20. };
  21.  
  22. memset(mcp->tx, '\0', sizeof(mcp->tx));
  23. memset(mcp->rx, '\0', sizeof(mcp->rx));
  24. mcp->tx[0] = mcp->addr | 0x01;
  25. mcp->tx[1] = reg << 1;
  26. spi_message_init(&mcp->msg);
  27. spi_message_add_tail(&t[0], &mcp->msg);
  28. spi_message_add_tail(&t[1], &mcp->msg);
  29. mcp->msg.complete = mcp23s17_read_irqsafe_complete;
  30. mcp->msg.context = mcp;
  31.  
  32. spin_lock_irqsave(&mcp->slock, mcp->irq_flags); /* lock */
  33. spi_async_locked(spi, &mcp->msg); /* call async */
  34. spin_lock_irqsave(&mcp->slock, flags); /* wait */
  35. spin_unlock_irqrestore(&mcp->slock, flags); /* unlock previous line*/
  36. return (mcp->msg.status == 0 ? ((mcp->rx[0] | (mcp->rx[1] << 8))) : -1);
  37. }
Advertisement
Add Comment
Please, Sign In to add comment