Lines Matching refs:dice

14 static u64 get_subaddr(struct snd_dice *dice, enum snd_dice_addr_type type,  in get_subaddr()  argument
19 offset += dice->tx_offset; in get_subaddr()
22 offset += dice->rx_offset; in get_subaddr()
25 offset += dice->sync_offset; in get_subaddr()
28 offset += dice->rsrv_offset; in get_subaddr()
32 offset += dice->global_offset; in get_subaddr()
39 int snd_dice_transaction_write(struct snd_dice *dice, in snd_dice_transaction_write() argument
43 return snd_fw_transaction(dice->unit, in snd_dice_transaction_write()
46 get_subaddr(dice, type, offset), buf, len, 0); in snd_dice_transaction_write()
49 int snd_dice_transaction_read(struct snd_dice *dice, in snd_dice_transaction_read() argument
53 return snd_fw_transaction(dice->unit, in snd_dice_transaction_read()
56 get_subaddr(dice, type, offset), buf, len, 0); in snd_dice_transaction_read()
59 static unsigned int get_clock_info(struct snd_dice *dice, __be32 *info) in get_clock_info() argument
61 return snd_dice_transaction_read_global(dice, GLOBAL_CLOCK_SELECT, in get_clock_info()
65 static int set_clock_info(struct snd_dice *dice, in set_clock_info() argument
75 err = get_clock_info(dice, &info); in set_clock_info()
101 if (completion_done(&dice->clock_accepted)) in set_clock_info()
102 reinit_completion(&dice->clock_accepted); in set_clock_info()
104 err = snd_dice_transaction_write_global(dice, GLOBAL_CLOCK_SELECT, in set_clock_info()
110 if (wait_for_completion_timeout(&dice->clock_accepted, in set_clock_info()
117 err = snd_dice_transaction_reinit(dice); in set_clock_info()
128 int snd_dice_transaction_get_clock_source(struct snd_dice *dice, in snd_dice_transaction_get_clock_source() argument
134 err = get_clock_info(dice, &info); in snd_dice_transaction_get_clock_source()
141 int snd_dice_transaction_get_rate(struct snd_dice *dice, unsigned int *rate) in snd_dice_transaction_get_rate() argument
147 err = get_clock_info(dice, &info); in snd_dice_transaction_get_rate()
161 int snd_dice_transaction_set_rate(struct snd_dice *dice, unsigned int rate) in snd_dice_transaction_set_rate() argument
163 return set_clock_info(dice, rate, UINT_MAX); in snd_dice_transaction_set_rate()
166 int snd_dice_transaction_set_enable(struct snd_dice *dice) in snd_dice_transaction_set_enable() argument
171 if (dice->global_enabled) in snd_dice_transaction_set_enable()
175 err = snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST, in snd_dice_transaction_set_enable()
176 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL, in snd_dice_transaction_set_enable()
179 FW_FIXED_GENERATION | dice->owner_generation); in snd_dice_transaction_set_enable()
183 dice->global_enabled = true; in snd_dice_transaction_set_enable()
188 void snd_dice_transaction_clear_enable(struct snd_dice *dice) in snd_dice_transaction_clear_enable() argument
193 snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST, in snd_dice_transaction_clear_enable()
194 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL, in snd_dice_transaction_clear_enable()
197 FW_FIXED_GENERATION | dice->owner_generation); in snd_dice_transaction_clear_enable()
199 dice->global_enabled = false; in snd_dice_transaction_clear_enable()
207 struct snd_dice *dice = callback_data; in dice_notification() local
222 spin_lock_irqsave(&dice->lock, flags); in dice_notification()
223 dice->notification_bits |= bits; in dice_notification()
224 spin_unlock_irqrestore(&dice->lock, flags); in dice_notification()
229 complete(&dice->clock_accepted); in dice_notification()
230 wake_up(&dice->hwdep_wait); in dice_notification()
233 static int register_notification_address(struct snd_dice *dice, bool retry) in register_notification_address() argument
235 struct fw_device *device = fw_parent_device(dice->unit); in register_notification_address()
250 dice->notification_handler.offset); in register_notification_address()
252 dice->owner_generation = device->generation; in register_notification_address()
254 err = snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP, in register_notification_address()
255 get_subaddr(dice, in register_notification_address()
260 dice->owner_generation); in register_notification_address()
269 dev_err(&dice->unit->device, in register_notification_address()
282 dice->owner_generation = -1; in register_notification_address()
287 static void unregister_notification_address(struct snd_dice *dice) in unregister_notification_address() argument
289 struct fw_device *device = fw_parent_device(dice->unit); in unregister_notification_address()
298 dice->notification_handler.offset); in unregister_notification_address()
300 snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP, in unregister_notification_address()
301 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL, in unregister_notification_address()
304 FW_FIXED_GENERATION | dice->owner_generation); in unregister_notification_address()
308 dice->owner_generation = -1; in unregister_notification_address()
311 void snd_dice_transaction_destroy(struct snd_dice *dice) in snd_dice_transaction_destroy() argument
313 struct fw_address_handler *handler = &dice->notification_handler; in snd_dice_transaction_destroy()
318 unregister_notification_address(dice); in snd_dice_transaction_destroy()
324 int snd_dice_transaction_reinit(struct snd_dice *dice) in snd_dice_transaction_reinit() argument
326 struct fw_address_handler *handler = &dice->notification_handler; in snd_dice_transaction_reinit()
331 return register_notification_address(dice, false); in snd_dice_transaction_reinit()
334 int snd_dice_transaction_init(struct snd_dice *dice) in snd_dice_transaction_init() argument
336 struct fw_address_handler *handler = &dice->notification_handler; in snd_dice_transaction_init()
346 err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST, in snd_dice_transaction_init()
355 handler->callback_data = dice; in snd_dice_transaction_init()
363 err = register_notification_address(dice, true); in snd_dice_transaction_init()
370 dice->global_offset = be32_to_cpu(pointers[0]) * 4; in snd_dice_transaction_init()
371 dice->tx_offset = be32_to_cpu(pointers[2]) * 4; in snd_dice_transaction_init()
372 dice->rx_offset = be32_to_cpu(pointers[4]) * 4; in snd_dice_transaction_init()
373 dice->sync_offset = be32_to_cpu(pointers[6]) * 4; in snd_dice_transaction_init()
374 dice->rsrv_offset = be32_to_cpu(pointers[8]) * 4; in snd_dice_transaction_init()
378 dice->clock_caps = 1; in snd_dice_transaction_init()