Lines Matching refs:stm
46 struct stm_device *stm = to_stm_device(dev); in masters_show() local
49 ret = sprintf(buf, "%u %u\n", stm->data->sw_start, stm->data->sw_end); in masters_show()
60 struct stm_device *stm = to_stm_device(dev); in channels_show() local
63 ret = sprintf(buf, "%u\n", stm->data->sw_nchannels); in channels_show()
76 ATTRIBUTE_GROUPS(stm);
104 struct stm_device *stm; in stm_find_device() local
114 stm = to_stm_device(dev); in stm_find_device()
115 if (!try_module_get(stm->owner)) { in stm_find_device()
120 return stm; in stm_find_device()
130 void stm_put_device(struct stm_device *stm) in stm_put_device() argument
132 module_put(stm->owner); in stm_put_device()
133 put_device(&stm->dev); in stm_put_device()
148 stm_master(struct stm_device *stm, unsigned int idx) in stm_master() argument
150 if (idx < stm->data->sw_start || idx > stm->data->sw_end) in stm_master()
153 return __stm_master(stm, idx); in stm_master()
156 static int stp_master_alloc(struct stm_device *stm, unsigned int idx) in stp_master_alloc() argument
161 size = ALIGN(stm->data->sw_nchannels, 8) / 8; in stp_master_alloc()
167 master->nr_free = stm->data->sw_nchannels; in stp_master_alloc()
168 __stm_master(stm, idx) = master; in stp_master_alloc()
173 static void stp_master_free(struct stm_device *stm, unsigned int idx) in stp_master_free() argument
175 struct stp_master *master = stm_master(stm, idx); in stp_master_free()
180 __stm_master(stm, idx) = NULL; in stp_master_free()
184 static void stm_output_claim(struct stm_device *stm, struct stm_output *output) in stm_output_claim() argument
186 struct stp_master *master = stm_master(stm, output->master); in stm_output_claim()
198 stm_output_disclaim(struct stm_device *stm, struct stm_output *output) in stm_output_disclaim() argument
200 struct stp_master *master = stm_master(stm, output->master); in stm_output_disclaim()
237 stm_find_master_chan(struct stm_device *stm, unsigned int width, in stm_find_master_chan() argument
246 if (!stm_master(stm, midx)) { in stm_find_master_chan()
247 err = stp_master_alloc(stm, midx); in stm_find_master_chan()
252 master = stm_master(stm, midx); in stm_find_master_chan()
270 static int stm_output_assign(struct stm_device *stm, unsigned int width, in stm_output_assign() argument
277 if (width > stm->data->sw_nchannels) in stm_output_assign()
284 midx = stm->data->sw_start; in stm_output_assign()
286 mend = stm->data->sw_end; in stm_output_assign()
287 cend = stm->data->sw_nchannels - 1; in stm_output_assign()
290 spin_lock(&stm->mc_lock); in stm_output_assign()
295 ret = stm_find_master_chan(stm, width, &midx, mend, &cidx, cend); in stm_output_assign()
302 stm_output_claim(stm, output); in stm_output_assign()
303 dev_dbg(&stm->dev, "assigned %u:%u (+%u)\n", midx, cidx, width); in stm_output_assign()
307 spin_unlock(&stm->mc_lock); in stm_output_assign()
312 static void stm_output_free(struct stm_device *stm, struct stm_output *output) in stm_output_free() argument
314 spin_lock(&stm->mc_lock); in stm_output_free()
316 stm_output_disclaim(stm, output); in stm_output_free()
317 spin_unlock(&stm->mc_lock); in stm_output_free()
342 stmf->stm = to_stm_device(dev); in stm_char_open()
344 if (!try_module_get(stmf->stm->owner)) in stm_char_open()
361 stm_output_free(stmf->stm, &stmf->output); in stm_char_release()
362 stm_put_device(stmf->stm); in stm_char_release()
370 struct stm_device *stm = stmf->stm; in stm_file_assign() local
373 stmf->policy_node = stp_policy_node_lookup(stm, id); in stm_file_assign()
375 ret = stm_output_assign(stm, width, stmf->policy_node, &stmf->output); in stm_file_assign()
405 struct stm_device *stm = stmf->stm; in stm_char_write() local
433 stm_write(stm->data, stmf->output.master, stmf->output.channel, kbuf, in stm_char_write()
444 struct stm_device *stm = stmf->stm; in stm_char_mmap() local
447 if (!stm->data->mmio_addr) in stm_char_mmap()
455 if (stmf->output.nr_chans * stm->data->sw_mmiosz != size) in stm_char_mmap()
458 phys = stm->data->mmio_addr(stm->data, stmf->output.master, in stm_char_mmap()
474 struct stm_device *stm = stmf->stm; in stm_char_policy_set_ioctl() local
505 id->width > PAGE_SIZE / stm->data->sw_mmiosz) in stm_char_policy_set_ioctl()
514 if (stm->data->link) in stm_char_policy_set_ioctl()
515 ret = stm->data->link(stm->data, stmf->output.master, in stm_char_policy_set_ioctl()
519 stm_output_free(stmf->stm, &stmf->output); in stm_char_policy_set_ioctl()
520 stm_put_device(stmf->stm); in stm_char_policy_set_ioctl()
547 struct stm_data *stm_data = stmf->stm->data; in stm_char_ioctl()
603 struct stm_device *stm = to_stm_device(dev); in stm_device_release() local
605 kfree(stm); in stm_device_release()
611 struct stm_device *stm; in stm_register_device() local
622 stm = kzalloc(sizeof(*stm) + nmasters * sizeof(void *), GFP_KERNEL); in stm_register_device()
623 if (!stm) in stm_register_device()
626 stm->major = register_chrdev(0, stm_data->name, &stm_fops); in stm_register_device()
627 if (stm->major < 0) in stm_register_device()
630 device_initialize(&stm->dev); in stm_register_device()
631 stm->dev.devt = MKDEV(stm->major, 0); in stm_register_device()
632 stm->dev.class = &stm_class; in stm_register_device()
633 stm->dev.parent = parent; in stm_register_device()
634 stm->dev.release = stm_device_release; in stm_register_device()
636 err = kobject_set_name(&stm->dev.kobj, "%s", stm_data->name); in stm_register_device()
640 err = device_add(&stm->dev); in stm_register_device()
644 spin_lock_init(&stm->link_lock); in stm_register_device()
645 INIT_LIST_HEAD(&stm->link_list); in stm_register_device()
647 spin_lock_init(&stm->mc_lock); in stm_register_device()
648 mutex_init(&stm->policy_mutex); in stm_register_device()
649 stm->sw_nmasters = nmasters; in stm_register_device()
650 stm->owner = owner; in stm_register_device()
651 stm->data = stm_data; in stm_register_device()
652 stm_data->stm = stm; in stm_register_device()
657 put_device(&stm->dev); in stm_register_device()
659 kfree(stm); in stm_register_device()
666 struct stm_device *stm);
670 struct stm_device *stm = stm_data->stm; in stm_unregister_device() local
674 spin_lock(&stm->link_lock); in stm_unregister_device()
675 list_for_each_entry_safe(src, iter, &stm->link_list, link_entry) { in stm_unregister_device()
676 __stm_source_link_drop(src, stm); in stm_unregister_device()
678 spin_unlock(&stm->link_lock); in stm_unregister_device()
682 unregister_chrdev(stm->major, stm_data->name); in stm_unregister_device()
684 mutex_lock(&stm->policy_mutex); in stm_unregister_device()
685 if (stm->policy) in stm_unregister_device()
686 stp_policy_unbind(stm->policy); in stm_unregister_device()
687 mutex_unlock(&stm->policy_mutex); in stm_unregister_device()
689 for (i = 0; i < stm->sw_nmasters; i++) in stm_unregister_device()
690 stp_master_free(stm, i); in stm_unregister_device()
692 device_unregister(&stm->dev); in stm_unregister_device()
693 stm_data->stm = NULL; in stm_unregister_device()
708 struct stm_device *stm) in stm_source_link_add() argument
713 spin_lock(&stm->link_lock); in stm_source_link_add()
717 rcu_assign_pointer(src->link, stm); in stm_source_link_add()
718 list_add_tail(&src->link_entry, &stm->link_list); in stm_source_link_add()
721 spin_unlock(&stm->link_lock); in stm_source_link_add()
726 stp_policy_node_lookup(stm, id); in stm_source_link_add()
731 err = stm_output_assign(stm, src->data->nr_chans, in stm_source_link_add()
741 if (stm->data->link) in stm_source_link_add()
742 err = stm->data->link(stm->data, src->output.master, in stm_source_link_add()
755 stm_output_free(stm, &src->output); in stm_source_link_add()
756 stm_put_device(stm); in stm_source_link_add()
759 spin_lock(&stm->link_lock); in stm_source_link_add()
766 spin_unlock(&stm->link_lock); in stm_source_link_add()
782 struct stm_device *stm) in __stm_source_link_drop() argument
788 if (WARN_ON_ONCE(link != stm)) { in __stm_source_link_drop()
815 struct stm_device *stm; in stm_source_link_drop() local
819 stm = srcu_dereference(src->link, &stm_source_srcu); in stm_source_link_drop()
821 if (stm) { in stm_source_link_drop()
825 spin_lock(&stm->link_lock); in stm_source_link_drop()
826 __stm_source_link_drop(src, stm); in stm_source_link_drop()
827 spin_unlock(&stm->link_lock); in stm_source_link_drop()
838 struct stm_device *stm; in stm_source_link_show() local
842 stm = srcu_dereference(src->link, &stm_source_srcu); in stm_source_link_show()
844 stm ? dev_name(&stm->dev) : "<none>"); in stm_source_link_show()
963 struct stm_device *stm; in stm_source_write() local
974 stm = srcu_dereference(src->link, &stm_source_srcu); in stm_source_write()
975 if (stm) in stm_source_write()
976 stm_write(stm->data, src->output.master, in stm_source_write()