work_data
struct atmel_i2c_work_data *work_data;
work_data = kmalloc_obj(*work_data, gfp);
if (!work_data)
work_data->ctx = ctx;
work_data->client = ctx->client;
ret = atmel_i2c_init_ecdh_cmd(&work_data->cmd, req->src);
atmel_i2c_enqueue(work_data, atmel_ecdh_done, req);
kfree(work_data);
static void atmel_ecdh_done(struct atmel_i2c_work_data *work_data, void *areq,
struct atmel_i2c_cmd *cmd = &work_data->cmd;
kfree_sensitive(work_data);
struct atmel_i2c_work_data *work_data =
struct atmel_i2c_cmd *cmd = &work_data->cmd;
struct i2c_client *client = work_data->client;
work_data->cbk(work_data, work_data->areq, status);
void atmel_i2c_enqueue(struct atmel_i2c_work_data *work_data,
void (*cbk)(struct atmel_i2c_work_data *work_data,
work_data->cbk = (void *)cbk;
work_data->areq = areq;
INIT_WORK(&work_data->work, atmel_i2c_work_handler);
queue_work(atmel_wq, &work_data->work);
void (*cbk)(struct atmel_i2c_work_data *work_data, void *areq,
void atmel_i2c_enqueue(struct atmel_i2c_work_data *work_data,
void (*cbk)(struct atmel_i2c_work_data *work_data,
static void atmel_sha204a_rng_done(struct atmel_i2c_work_data *work_data,
struct atmel_i2c_client_priv *i2c_priv = work_data->ctx;
rng->priv = (unsigned long)work_data;
struct atmel_i2c_work_data *work_data;
work_data = (struct atmel_i2c_work_data *)rng->priv;
max = min(sizeof(work_data->cmd.data), max);
memcpy(data, &work_data->cmd.data, max);
work_data = kmalloc_obj(*work_data, GFP_ATOMIC);
if (!work_data) {
work_data->ctx = i2c_priv;
work_data->client = i2c_priv->client;
atmel_i2c_init_random_cmd(&work_data->cmd);
atmel_i2c_enqueue(work_data, atmel_sha204a_rng_done, rng);
&priv->ring[ring].work_data.work);
priv->ring[i].work_data.priv = priv;
priv->ring[i].work_data.ring = i;
INIT_WORK(&priv->ring[i].work_data.work,
struct safexcel_work_data work_data;
&priv->ring[ring].work_data.work);
&priv->ring[ring].work_data.work);
&priv->ring[ring].work_data.work);
&priv->ring[ring].work_data.work);
&priv->ring[ring].work_data.work);
&priv->ring[ring].work_data.work);
static int cs40l50_effect_bank_set(struct cs40l50_work *work_data,
s16 bank_type = work_data->custom_data[0] & CS40L50_CUSTOM_DATA_MASK;
dev_err(work_data->vib->dev, "Invalid bank (%d)\n", bank_type);
if (work_data->custom_len > CS40L50_OWT_CUSTOM_DATA_SIZE)
static int cs40l50_effect_index_set(struct cs40l50_work *work_data,
struct cs40l50_vibra *vib = work_data->vib;
effect->index += work_data->custom_data[1] & CS40L50_CUSTOM_DATA_MASK;
static int cs40l50_effect_gpio_mapping_set(struct cs40l50_work *work_data,
u16 gpio_edge, gpio_num, button = work_data->effect->trigger.button;
struct cs40l50_vibra *vib = work_data->vib;
static int cs40l50_upload_owt(struct cs40l50_work *work_data)
struct cs40l50_vibra *vib = work_data->vib;
size_t len = work_data->custom_len * 2;
header.type = work_data->custom_data[0] == CS40L50_PCM_ID ? CS40L50_TYPE_PCM :
memcpy(new_owt_effect_data + sizeof(header), work_data->custom_data, len);
struct cs40l50_work *work_data = container_of(work, struct cs40l50_work, work);
struct cs40l50_vibra *vib = work_data->vib;
effect = cs40l50_find_effect(work_data->effect->id, &vib->effect_head);
effect->id = work_data->effect->id;
error = cs40l50_effect_bank_set(work_data, effect);
error = cs40l50_effect_index_set(work_data, effect);
error = cs40l50_effect_gpio_mapping_set(work_data, effect);
error = cs40l50_upload_owt(work_data);
work_data->error = error;
struct cs40l50_work work_data;
work_data.custom_data = memdup_array_user(effect->u.periodic.custom_data,
if (IS_ERR(work_data.custom_data))
return PTR_ERR(work_data.custom_data);
work_data.custom_len = effect->u.periodic.custom_len;
work_data.vib = vib;
work_data.effect = effect;
INIT_WORK_ONSTACK(&work_data.work, cs40l50_add_worker);
queue_work(vib->vib_wq, &work_data.work);
flush_work(&work_data.work);
destroy_work_on_stack(&work_data.work);
kfree(work_data.custom_data);
return work_data.error;
struct cs40l50_work *work_data = container_of(work, struct cs40l50_work, work);
struct cs40l50_vibra *vib = work_data->vib;
start_effect = cs40l50_find_effect(work_data->effect->id, &vib->effect_head);
while (--work_data->count >= 0) {
usleep_range(work_data->effect->replay.length,
work_data->effect->replay.length + 100);
kfree(work_data);
struct cs40l50_work *work_data = container_of(work, struct cs40l50_work, work);
struct cs40l50_vibra *vib = work_data->vib;
kfree(work_data);
struct cs40l50_work *work_data;
work_data = kzalloc_obj(*work_data, GFP_ATOMIC);
if (!work_data)
work_data->vib = vib;
work_data->effect = &dev->ff->effects[effect_id];
work_data->count = val;
INIT_WORK(&work_data->work, cs40l50_start_worker);
INIT_WORK(&work_data->work, cs40l50_stop_worker);
queue_work(vib->vib_wq, &work_data->work);
struct cs40l50_work *work_data = container_of(work, struct cs40l50_work, work);
struct cs40l50_vibra *vib = work_data->vib;
erase_effect = cs40l50_find_effect(work_data->effect->id, &vib->effect_head);
work_data->error = error;
struct cs40l50_work work_data;
work_data.vib = vib;
work_data.effect = &dev->ff->effects[effect_id];
INIT_WORK_ONSTACK(&work_data.work, cs40l50_erase_worker);
queue_work(vib->vib_wq, &work_data.work);
flush_work(&work_data.work);
destroy_work_on_stack(&work_data.work);
return work_data.error;
struct rtw_sdio_work_data *work_data =
rtwdev = work_data->rtwdev;
static void pwq_dec_nr_in_flight(struct pool_workqueue *pwq, unsigned long work_data)
int color = get_work_color(work_data);
if (!(work_data & WORK_STRUCT_INACTIVE))
unsigned long work_data = *work_data_bits(work);
if (work_data & WORK_STRUCT_INACTIVE)
pwq_dec_nr_in_flight(pwq, work_data);
unsigned long work_data;
work_data = *work_data_bits(work);
worker->current_color = get_work_color(work_data);
pwq_dec_nr_in_flight(pwq, work_data);
static int get_work_color(unsigned long work_data)
return (work_data >> WORK_STRUCT_COLOR_SHIFT) &
struct work_data *data, int cpu)
struct work_data *data;
data = calloc(nr_cpus, sizeof(struct work_data));
struct work_data *data;
struct work_data new_data = {
__uint(value_size, sizeof(struct work_data));