Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- static void mcp23s17_read_irqsafe_complete(void *context)
- {
- struct mcp23s08 *mcp = context;
- spin_unlock_irqrestore(&mcp->slock, mcp->irq_flags);
- }
- static int mcp23s17_read_irqsafe(struct mcp23s08 *mcp, unsigned reg)
- {
- unsigned long flags;
- struct spi_device *spi = mcp->data;
- struct spi_transfer t[2] = {
- [0] = {
- .tx_buf = mcp->tx,
- .len = 2,
- },
- [1] = {
- .rx_buf = mcp->rx,
- .len = 2,
- },
- };
- memset(mcp->tx, '\0', sizeof(mcp->tx));
- memset(mcp->rx, '\0', sizeof(mcp->rx));
- mcp->tx[0] = mcp->addr | 0x01;
- mcp->tx[1] = reg << 1;
- spi_message_init(&mcp->msg);
- spi_message_add_tail(&t[0], &mcp->msg);
- spi_message_add_tail(&t[1], &mcp->msg);
- mcp->msg.complete = mcp23s17_read_irqsafe_complete;
- mcp->msg.context = mcp;
- spin_lock_irqsave(&mcp->slock, mcp->irq_flags); /* lock */
- spi_async_locked(spi, &mcp->msg); /* call async */
- spin_lock_irqsave(&mcp->slock, flags); /* wait */
- spin_unlock_irqrestore(&mcp->slock, flags); /* unlock previous line*/
- return (mcp->msg.status == 0 ? ((mcp->rx[0] | (mcp->rx[1] << 8))) : -1);
- }
Advertisement
Add Comment
Please, Sign In to add comment