Messages in this thread | | | From | Oliver Neukum <> | Subject | Re: TDM bus support in Linux Kernel [PATCH] | Date | Wed, 30 Jan 2013 14:43:29 +0100 |
| |
On Wednesday 30 January 2013 12:37:25 Kurachkin Michail wrote: > Hi Greg, > > I followed your recommendations and created a diff using Linux 3.8-rc5 sources. Please review it and give your comments. > Part #5
+/** + * Reset SLIC + */ +static int slic_reset(struct si3226x_slic *slic) +{ + unsigned long timeout; + + gpio_set_value(slic->reset_gpio, 0); + + timeout = jiffies + MSEC(RESET_SLIC_PERIOD); + + while(!(time_after(jiffies, timeout))) + schedule();
Ouch. We have a delay primitive.
+ + gpio_set_value(slic->reset_gpio, 1); + + return 0; +}
+/** + * Receive voice data block from TDM voice channel controller. + * @param ch - voice channel attendant to transmit data in TDM frame + * @param data - pointer to read data received by DMA. + Length data for read equal to value returned by get_tdm_voice_block_size() + * + * Context: can sleep + * @return 0 on success; negative errno on failure + */ +static int kirkwood_recv(struct tdm_voice_channel *ch, u8 *data) +{ + struct kirkwood_tdm_voice *onchip_ch = ch->private_data; + + wait_event_interruptible(ch->rx_queue, + get_rx_latency(onchip_ch) > 1);
If you are waiting interruptably, you need to be able to handle an interruption.
+ + memcpy(data, onchip_ch->rx_buf[atomic_read(&onchip_ch->read_rx_buf_num)], + ch->buffer_len); + + atomic_set(&onchip_ch->read_rx_buf_num, + inc_next_dma_buf_num(atomic_read(&onchip_ch->read_rx_buf_num))); + + return 0; +}
| |