示例#1
0
void dma_controller_destroy(struct dma_controller *c)
{
    struct ux500_dma_controller *controller = container_of(c,
            struct ux500_dma_controller, controller);

    ux500_dma_controller_stop(controller);
    kfree(controller);
}
static int ux500_dma_controller_start(struct dma_controller *c)
{
	struct ux500_dma_controller *controller = container_of(c,
			struct ux500_dma_controller, controller);
	struct ux500_dma_channel *ux500_channel = NULL;
	struct musb *musb = controller->private_data;
	struct device *dev = musb->controller;
	struct musb_hdrc_platform_data *plat = dev->platform_data;
	struct ux500_musb_board_data *data = plat->board_data;
	struct dma_channel *dma_channel = NULL;
	u32 ch_num;
	u8 dir;
	u8 is_tx = 0;

	void **param_array;
	struct ux500_dma_channel *channel_array;
	u32 ch_count;
	dma_cap_mask_t mask;

	if ((data->num_rx_channels > UX500_MUSB_DMA_NUM_RX_CHANNELS) ||
		(data->num_tx_channels > UX500_MUSB_DMA_NUM_TX_CHANNELS))
		return -EINVAL;

	controller->num_rx_channels = data->num_rx_channels;
	controller->num_tx_channels = data->num_tx_channels;

	dma_cap_zero(mask);
	dma_cap_set(DMA_SLAVE, mask);

	
	channel_array = controller->rx_channel;
	ch_count = data->num_rx_channels;
	param_array = data->dma_rx_param_array;

	for (dir = 0; dir < 2; dir++) {
		for (ch_num = 0; ch_num < ch_count; ch_num++) {
			ux500_channel = &channel_array[ch_num];
			ux500_channel->controller = controller;
			ux500_channel->ch_num = ch_num;
			ux500_channel->is_tx = is_tx;

			dma_channel = &(ux500_channel->channel);
			dma_channel->private_data = ux500_channel;
			dma_channel->status = MUSB_DMA_STATUS_FREE;
			dma_channel->max_len = SZ_16M;

			ux500_channel->dma_chan = dma_request_channel(mask,
							data->dma_filter,
							param_array[ch_num]);
			if (!ux500_channel->dma_chan) {
				ERR("Dma pipe allocation error dir=%d ch=%d\n",
					dir, ch_num);

				
				ux500_dma_controller_stop(c);

				return -EBUSY;
			}

		}

		
		channel_array = controller->tx_channel;
		ch_count = data->num_tx_channels;
		param_array = data->dma_tx_param_array;
		is_tx = 1;
	}

	return 0;
}
示例#3
0
static int ux500_dma_controller_start(struct ux500_dma_controller *controller)
{
    struct ux500_dma_channel *ux500_channel = NULL;
    struct musb *musb = controller->private_data;
    struct device *dev = musb->controller;
    struct musb_hdrc_platform_data *plat = dev_get_platdata(dev);
    struct ux500_musb_board_data *data;
    struct dma_channel *dma_channel = NULL;
    char **chan_names;
    u32 ch_num;
    u8 dir;
    u8 is_tx = 0;

    void **param_array;
    struct ux500_dma_channel *channel_array;
    dma_cap_mask_t mask;

    if (!plat) {
        dev_err(musb->controller, "No platform data\n");
        return -EINVAL;
    }

    data = plat->board_data;

    dma_cap_zero(mask);
    dma_cap_set(DMA_SLAVE, mask);

    /* Prepare the loop for RX channels */
    channel_array = controller->rx_channel;
    param_array = data ? data->dma_rx_param_array : NULL;
    chan_names = (char **)iep_chan_names;

    for (dir = 0; dir < 2; dir++) {
        for (ch_num = 0;
                ch_num < UX500_MUSB_DMA_NUM_RX_TX_CHANNELS;
                ch_num++) {
            ux500_channel = &channel_array[ch_num];
            ux500_channel->controller = controller;
            ux500_channel->ch_num = ch_num;
            ux500_channel->is_tx = is_tx;

            dma_channel = &(ux500_channel->channel);
            dma_channel->private_data = ux500_channel;
            dma_channel->status = MUSB_DMA_STATUS_FREE;
            dma_channel->max_len = SZ_16M;

            ux500_channel->dma_chan =
                dma_request_slave_channel(dev, chan_names[ch_num]);

            if (!ux500_channel->dma_chan)
                ux500_channel->dma_chan =
                    dma_request_channel(mask,
                                        data ?
                                        data->dma_filter :
                                        NULL,
                                        param_array[ch_num]);

            if (!ux500_channel->dma_chan) {
                ERR("Dma pipe allocation error dir=%d ch=%d\n",
                    dir, ch_num);

                /* Release already allocated channels */
                ux500_dma_controller_stop(controller);

                return -EBUSY;
            }

        }

        /* Prepare the loop for TX channels */
        channel_array = controller->tx_channel;
        param_array = data ? data->dma_tx_param_array : NULL;
        chan_names = (char **)oep_chan_names;
        is_tx = 1;
    }

    return 0;
}