Lines Matching defs:dice

9 #include "dice.h"
11 static u64 get_subaddr(struct snd_dice *dice, enum snd_dice_addr_type type,
16 offset += dice->tx_offset;
19 offset += dice->rx_offset;
22 offset += dice->sync_offset;
25 offset += dice->rsrv_offset;
29 offset += dice->global_offset;
36 int snd_dice_transaction_write(struct snd_dice *dice,
40 return snd_fw_transaction(dice->unit,
43 get_subaddr(dice, type, offset), buf, len, 0);
46 int snd_dice_transaction_read(struct snd_dice *dice,
50 return snd_fw_transaction(dice->unit,
53 get_subaddr(dice, type, offset), buf, len, 0);
56 static unsigned int get_clock_info(struct snd_dice *dice, __be32 *info)
58 return snd_dice_transaction_read_global(dice, GLOBAL_CLOCK_SELECT,
62 int snd_dice_transaction_get_clock_source(struct snd_dice *dice,
68 err = get_clock_info(dice, &info);
75 int snd_dice_transaction_get_rate(struct snd_dice *dice, unsigned int *rate)
81 err = get_clock_info(dice, &info);
96 int snd_dice_transaction_set_enable(struct snd_dice *dice)
101 if (dice->global_enabled)
105 err = snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
106 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL,
109 FW_FIXED_GENERATION | dice->owner_generation);
113 dice->global_enabled = true;
118 void snd_dice_transaction_clear_enable(struct snd_dice *dice)
123 snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST,
124 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL,
127 FW_FIXED_GENERATION | dice->owner_generation);
129 dice->global_enabled = false;
137 struct snd_dice *dice = callback_data;
152 spin_lock_irqsave(&dice->lock, flags);
153 dice->notification_bits |= bits;
154 spin_unlock_irqrestore(&dice->lock, flags);
159 complete(&dice->clock_accepted);
160 wake_up(&dice->hwdep_wait);
163 static int register_notification_address(struct snd_dice *dice, bool retry)
165 struct fw_device *device = fw_parent_device(dice->unit);
180 dice->notification_handler.offset);
182 dice->owner_generation = device->generation;
184 err = snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP,
185 get_subaddr(dice,
190 dice->owner_generation);
199 dev_err(&dice->unit->device,
212 dice->owner_generation = -1;
217 static void unregister_notification_address(struct snd_dice *dice)
219 struct fw_device *device = fw_parent_device(dice->unit);
228 dice->notification_handler.offset);
230 snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP,
231 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL,
234 FW_FIXED_GENERATION | dice->owner_generation);
238 dice->owner_generation = -1;
241 void snd_dice_transaction_destroy(struct snd_dice *dice)
243 struct fw_address_handler *handler = &dice->notification_handler;
248 unregister_notification_address(dice);
254 int snd_dice_transaction_reinit(struct snd_dice *dice)
256 struct fw_address_handler *handler = &dice->notification_handler;
261 return register_notification_address(dice, false);
264 static int get_subaddrs(struct snd_dice *dice)
289 err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST,
308 err = snd_fw_transaction(dice->unit, TCODE_READ_QUADLET_REQUEST,
317 dev_err(&dice->unit->device,
325 dice->clock_caps = 1;
328 dice->global_offset = be32_to_cpu(pointers[0]) * 4;
329 dice->tx_offset = be32_to_cpu(pointers[2]) * 4;
330 dice->rx_offset = be32_to_cpu(pointers[4]) * 4;
334 dice->sync_offset = be32_to_cpu(pointers[6]) * 4;
336 dice->rsrv_offset = be32_to_cpu(pointers[8]) * 4;
342 int snd_dice_transaction_init(struct snd_dice *dice)
344 struct fw_address_handler *handler = &dice->notification_handler;
347 err = get_subaddrs(dice);
354 handler->callback_data = dice;
362 err = register_notification_address(dice, true);