int stmp3xxx_dma_request(int ch, struct device *dev, const char *name) { struct stmp3xxx_dma_user *user; int err = 0; user = channels + ch; if (!IS_VALID_CHANNEL(ch)) { err = -ENODEV; goto out; } if (IS_USED(ch)) { err = -EBUSY; goto out; } /* Create a pool to allocate dma commands from */ user->pool = dma_pool_create(name, dev, pool_item_size, pool_alignment, PAGE_SIZE); if (user->pool == NULL) { err = -ENOMEM; goto out; } user->name = name; user->inuse++; out: return err; }
int stmp3xxx_dma_free_command(int channel, struct stmp3xxx_dma_descriptor *descriptor) { int err = 0; if (!IS_VALID_CHANNEL(channel)) { err = -ENODEV; goto out; } if (!IS_USED(channel)) { err = -EBUSY; goto out; } /* Return the command memory to the pool */ dma_pool_free(channels[channel].pool, descriptor->command, descriptor->handle); /* Initialise descriptor so we're not tempted to use it */ descriptor->command = NULL; descriptor->handle = 0; descriptor->virtual_buf_ptr = NULL; descriptor->next_descr = NULL; WARN_ON(err); out: return err; }
int stmp3xxx_dma_allocate_command(int channel, struct stmp3xxx_dma_descriptor *descriptor) { struct stmp3xxx_dma_user *user = channels + channel; int err = 0; if (!IS_VALID_CHANNEL(channel)) { err = -ENODEV; goto out; } if (!IS_USED(channel)) { err = -EBUSY; goto out; } if (descriptor == NULL) { err = -EINVAL; goto out; } /* Allocate memory for a command from the buffer */ descriptor->command = dma_pool_alloc(user->pool, GFP_KERNEL, &descriptor->handle); /* Check it worked */ if (!descriptor->command) { err = -ENOMEM; goto out; } memset(descriptor->command, 0, pool_item_size); out: WARN_ON(err); return err; }
/** Configures the ZNP to only join the specified channel. Wrapper for setChannelMask if only one channel is desired. @param channel must be 11..26, inclusive. If set to 0 then ZNP will scan ALL CHANNELS @post znpResult contains the error code, or ZNP_SUCCESS if success. */ void setChannel(unsigned char channel) { if ((!IS_VALID_CHANNEL(channel)) && (channel != 0x00)) { znpResult = -10; return; } unsigned long channelMask = 1; setChannelMask((channel == 0) ? ANY_CHANNEL :(channelMask << channel)); //will set znpResult on success/fail }
Dio_LevelType Dio_ReadChannel(Dio_ChannelType channelId) { Dio_LevelType level; VALIDATE_RV( DioGlobal.InitRun, DIO_READCHANNEL_ID, DIO_E_UNINIT, (Dio_LevelType)0 ); /** @req SWS_Dio_00074 */ VALIDATE_RV( IS_VALID_CHANNEL(channelId), DIO_READCHANNEL_ID, DIO_E_PARAM_INVALID_CHANNEL_ID, (Dio_LevelType)0 ); Dio_PortLevelType portVal = Dio_ReadPort(DIO_GET_PORT_FROM_CHANNEL_ID(channelId)); Dio_PortLevelType bit = DIO_GET_BIT_FROM_CHANNEL_ID(channelId); if ((portVal & bit) != STD_LOW){ level = STD_HIGH; } else{ level = STD_LOW; } return (level); }
int stmp3xxx_dma_release(int ch) { struct stmp3xxx_dma_user *user = channels + ch; int err = 0; if (!IS_VALID_CHANNEL(ch)) { err = -ENODEV; goto out; } if (!IS_USED(ch)) { err = -EBUSY; goto out; } BUG_ON(user->pool == NULL); dma_pool_destroy(user->pool); user->inuse--; out: return err; }
void Dio_WriteChannel(Dio_ChannelType channelId, Dio_LevelType level) { VALIDATE( DioGlobal.InitRun, DIO_WRITECHANNEL_ID, DIO_E_UNINIT ); /** @req SWS_Dio_00074 */ VALIDATE( IS_VALID_CHANNEL(channelId), DIO_WRITECHANNEL_ID, DIO_E_PARAM_INVALID_CHANNEL_ID); Dio_PortLevelType portVal = GPIO_ReadOutputData(GPIO_ports[DIO_GET_PORT_FROM_CHANNEL_ID(channelId)]); Dio_PortLevelType bit = DIO_GET_BIT_FROM_CHANNEL_ID(channelId); if(level == STD_HIGH){ portVal |= bit; }else{ portVal &= ~bit; } Dio_WritePort(DIO_GET_PORT_FROM_CHANNEL_ID(channelId), portVal); return; }