Lines Matching refs:dice

12 static u64 get_subaddr(struct snd_dice *dice, enum snd_dice_addr_type type,  in get_subaddr()  argument
17 offset += dice->tx_offset; in get_subaddr()
20 offset += dice->rx_offset; in get_subaddr()
23 offset += dice->sync_offset; in get_subaddr()
26 offset += dice->rsrv_offset; in get_subaddr()
30 offset += dice->global_offset; in get_subaddr()
37 int snd_dice_transaction_write(struct snd_dice *dice, in snd_dice_transaction_write() argument
41 return snd_fw_transaction(dice->unit, in snd_dice_transaction_write()
44 get_subaddr(dice, type, offset), buf, len, 0); in snd_dice_transaction_write()
47 int snd_dice_transaction_read(struct snd_dice *dice, in snd_dice_transaction_read() argument
51 return snd_fw_transaction(dice->unit, in snd_dice_transaction_read()
54 get_subaddr(dice, type, offset), buf, len, 0); in snd_dice_transaction_read()
57 static unsigned int get_clock_info(struct snd_dice *dice, __be32 *info) in get_clock_info() argument
59 return snd_dice_transaction_read_global(dice, GLOBAL_CLOCK_SELECT, in get_clock_info()
63 int snd_dice_transaction_get_clock_source(struct snd_dice *dice, in snd_dice_transaction_get_clock_source() argument
69 err = get_clock_info(dice, &info); in snd_dice_transaction_get_clock_source()
76 int snd_dice_transaction_get_rate(struct snd_dice *dice, unsigned int *rate) in snd_dice_transaction_get_rate() argument
82 err = get_clock_info(dice, &info); in snd_dice_transaction_get_rate()
97 int snd_dice_transaction_set_enable(struct snd_dice *dice) in snd_dice_transaction_set_enable() argument
102 if (dice->global_enabled) in snd_dice_transaction_set_enable()
106 err = snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST, in snd_dice_transaction_set_enable()
107 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL, in snd_dice_transaction_set_enable()
110 FW_FIXED_GENERATION | dice->owner_generation); in snd_dice_transaction_set_enable()
114 dice->global_enabled = true; in snd_dice_transaction_set_enable()
119 void snd_dice_transaction_clear_enable(struct snd_dice *dice) in snd_dice_transaction_clear_enable() argument
124 snd_fw_transaction(dice->unit, TCODE_WRITE_QUADLET_REQUEST, in snd_dice_transaction_clear_enable()
125 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL, in snd_dice_transaction_clear_enable()
128 FW_FIXED_GENERATION | dice->owner_generation); in snd_dice_transaction_clear_enable()
130 dice->global_enabled = false; in snd_dice_transaction_clear_enable()
138 struct snd_dice *dice = callback_data; in dice_notification() local
153 spin_lock_irqsave(&dice->lock, flags); in dice_notification()
154 dice->notification_bits |= bits; in dice_notification()
155 spin_unlock_irqrestore(&dice->lock, flags); in dice_notification()
160 complete(&dice->clock_accepted); in dice_notification()
161 wake_up(&dice->hwdep_wait); in dice_notification()
164 static int register_notification_address(struct snd_dice *dice, bool retry) in register_notification_address() argument
166 struct fw_device *device = fw_parent_device(dice->unit); in register_notification_address()
181 dice->notification_handler.offset); in register_notification_address()
183 dice->owner_generation = device->generation; in register_notification_address()
185 err = snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP, in register_notification_address()
186 get_subaddr(dice, in register_notification_address()
191 dice->owner_generation); in register_notification_address()
200 dev_err(&dice->unit->device, in register_notification_address()
213 dice->owner_generation = -1; in register_notification_address()
218 static void unregister_notification_address(struct snd_dice *dice) in unregister_notification_address() argument
220 struct fw_device *device = fw_parent_device(dice->unit); in unregister_notification_address()
229 dice->notification_handler.offset); in unregister_notification_address()
231 snd_fw_transaction(dice->unit, TCODE_LOCK_COMPARE_SWAP, in unregister_notification_address()
232 get_subaddr(dice, SND_DICE_ADDR_TYPE_GLOBAL, in unregister_notification_address()
235 FW_FIXED_GENERATION | dice->owner_generation); in unregister_notification_address()
239 dice->owner_generation = -1; in unregister_notification_address()
242 void snd_dice_transaction_destroy(struct snd_dice *dice) in snd_dice_transaction_destroy() argument
244 struct fw_address_handler *handler = &dice->notification_handler; in snd_dice_transaction_destroy()
249 unregister_notification_address(dice); in snd_dice_transaction_destroy()
255 int snd_dice_transaction_reinit(struct snd_dice *dice) in snd_dice_transaction_reinit() argument
257 struct fw_address_handler *handler = &dice->notification_handler; in snd_dice_transaction_reinit()
262 return register_notification_address(dice, false); in snd_dice_transaction_reinit()
265 static int get_subaddrs(struct snd_dice *dice) in get_subaddrs() argument
290 err = snd_fw_transaction(dice->unit, TCODE_READ_BLOCK_REQUEST, in get_subaddrs()
309 err = snd_fw_transaction(dice->unit, TCODE_READ_QUADLET_REQUEST, in get_subaddrs()
318 dev_err(&dice->unit->device, in get_subaddrs()
326 dice->clock_caps = 1; in get_subaddrs()
329 dice->global_offset = be32_to_cpu(pointers[0]) * 4; in get_subaddrs()
330 dice->tx_offset = be32_to_cpu(pointers[2]) * 4; in get_subaddrs()
331 dice->rx_offset = be32_to_cpu(pointers[4]) * 4; in get_subaddrs()
335 dice->sync_offset = be32_to_cpu(pointers[6]) * 4; in get_subaddrs()
337 dice->rsrv_offset = be32_to_cpu(pointers[8]) * 4; in get_subaddrs()
343 int snd_dice_transaction_init(struct snd_dice *dice) in snd_dice_transaction_init() argument
345 struct fw_address_handler *handler = &dice->notification_handler; in snd_dice_transaction_init()
348 err = get_subaddrs(dice); 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()