Lines Matching refs:stm

40 	struct stm_device *stm = to_stm_device(dev);  in masters_show()  local
43 ret = sprintf(buf, "%u %u\n", stm->data->sw_start, stm->data->sw_end); in masters_show()
54 struct stm_device *stm = to_stm_device(dev); in channels_show() local
57 ret = sprintf(buf, "%u\n", stm->data->sw_nchannels); in channels_show()
68 struct stm_device *stm = to_stm_device(dev); in hw_override_show() local
71 ret = sprintf(buf, "%u\n", stm->data->hw_override); in hw_override_show()
85 ATTRIBUTE_GROUPS(stm);
113 struct stm_device *stm; in stm_find_device() local
123 stm = to_stm_device(dev); in stm_find_device()
124 if (!try_module_get(stm->owner)) { in stm_find_device()
130 return stm; in stm_find_device()
140 void stm_put_device(struct stm_device *stm) in stm_put_device() argument
142 module_put(stm->owner); in stm_put_device()
143 put_device(&stm->dev); in stm_put_device()
158 stm_master(struct stm_device *stm, unsigned int idx) in stm_master() argument
160 if (idx < stm->data->sw_start || idx > stm->data->sw_end) in stm_master()
163 return __stm_master(stm, idx); in stm_master()
166 static int stp_master_alloc(struct stm_device *stm, unsigned int idx) in stp_master_alloc() argument
171 size = ALIGN(stm->data->sw_nchannels, 8) / 8; in stp_master_alloc()
177 master->nr_free = stm->data->sw_nchannels; in stp_master_alloc()
178 __stm_master(stm, idx) = master; in stp_master_alloc()
183 static void stp_master_free(struct stm_device *stm, unsigned int idx) in stp_master_free() argument
185 struct stp_master *master = stm_master(stm, idx); in stp_master_free()
190 __stm_master(stm, idx) = NULL; in stp_master_free()
194 static void stm_output_claim(struct stm_device *stm, struct stm_output *output) in stm_output_claim() argument
196 struct stp_master *master = stm_master(stm, output->master); in stm_output_claim()
198 lockdep_assert_held(&stm->mc_lock); in stm_output_claim()
211 stm_output_disclaim(struct stm_device *stm, struct stm_output *output) in stm_output_disclaim() argument
213 struct stp_master *master = stm_master(stm, output->master); in stm_output_disclaim()
215 lockdep_assert_held(&stm->mc_lock); in stm_output_disclaim()
253 stm_find_master_chan(struct stm_device *stm, unsigned int width, in stm_find_master_chan() argument
262 if (!stm_master(stm, midx)) { in stm_find_master_chan()
263 err = stp_master_alloc(stm, midx); in stm_find_master_chan()
268 master = stm_master(stm, midx); in stm_find_master_chan()
286 static int stm_output_assign(struct stm_device *stm, unsigned int width, in stm_output_assign() argument
293 if (width > stm->data->sw_nchannels) in stm_output_assign()
300 midx = stm->data->sw_start; in stm_output_assign()
302 mend = stm->data->sw_end; in stm_output_assign()
303 cend = stm->data->sw_nchannels - 1; in stm_output_assign()
306 spin_lock(&stm->mc_lock); in stm_output_assign()
312 ret = stm_find_master_chan(stm, width, &midx, mend, &cidx, cend); in stm_output_assign()
319 stm_output_claim(stm, output); in stm_output_assign()
320 dev_dbg(&stm->dev, "assigned %u:%u (+%u)\n", midx, cidx, width); in stm_output_assign()
325 spin_unlock(&stm->mc_lock); in stm_output_assign()
330 static void stm_output_free(struct stm_device *stm, struct stm_output *output) in stm_output_free() argument
332 spin_lock(&stm->mc_lock); in stm_output_free()
335 stm_output_disclaim(stm, output); in stm_output_free()
337 spin_unlock(&stm->mc_lock); in stm_output_free()
369 stmf->stm = to_stm_device(dev); in stm_char_open()
371 if (!try_module_get(stmf->stm->owner)) in stm_char_open()
390 struct stm_device *stm = stmf->stm; in stm_char_release() local
392 if (stm->data->unlink) in stm_char_release()
393 stm->data->unlink(stm->data, stmf->output.master, in stm_char_release()
396 stm_output_free(stm, &stmf->output); in stm_char_release()
402 stm_put_device(stm); in stm_char_release()
410 struct stm_device *stm = stmf->stm; in stm_file_assign() local
413 stmf->policy_node = stp_policy_node_lookup(stm, id); in stm_file_assign()
415 ret = stm_output_assign(stm, width, stmf->policy_node, &stmf->output); in stm_file_assign()
450 struct stm_device *stm = stmf->stm; in stm_char_write() local
481 pm_runtime_get_sync(&stm->dev); in stm_char_write()
483 count = stm_write(stm->data, stmf->output.master, stmf->output.channel, in stm_char_write()
486 pm_runtime_mark_last_busy(&stm->dev); in stm_char_write()
487 pm_runtime_put_autosuspend(&stm->dev); in stm_char_write()
496 struct stm_device *stm = stmf->stm; in stm_mmap_open() local
498 pm_runtime_get(&stm->dev); in stm_mmap_open()
504 struct stm_device *stm = stmf->stm; in stm_mmap_close() local
506 pm_runtime_mark_last_busy(&stm->dev); in stm_mmap_close()
507 pm_runtime_put_autosuspend(&stm->dev); in stm_mmap_close()
518 struct stm_device *stm = stmf->stm; in stm_char_mmap() local
521 if (!stm->data->mmio_addr) in stm_char_mmap()
529 if (stmf->output.nr_chans * stm->data->sw_mmiosz != size) in stm_char_mmap()
532 phys = stm->data->mmio_addr(stm->data, stmf->output.master, in stm_char_mmap()
539 pm_runtime_get_sync(&stm->dev); in stm_char_mmap()
551 struct stm_device *stm = stmf->stm; in stm_char_policy_set_ioctl() local
582 id->width > PAGE_SIZE / stm->data->sw_mmiosz) in stm_char_policy_set_ioctl()
589 if (stm->data->link) in stm_char_policy_set_ioctl()
590 ret = stm->data->link(stm->data, stmf->output.master, in stm_char_policy_set_ioctl()
594 stm_output_free(stmf->stm, &stmf->output); in stm_char_policy_set_ioctl()
620 struct stm_data *stm_data = stmf->stm->data; in stm_char_ioctl()
676 struct stm_device *stm = to_stm_device(dev); in stm_device_release() local
678 vfree(stm); in stm_device_release()
684 struct stm_device *stm; in stm_register_device() local
695 stm = vzalloc(sizeof(*stm) + nmasters * sizeof(void *)); in stm_register_device()
696 if (!stm) in stm_register_device()
699 stm->major = register_chrdev(0, stm_data->name, &stm_fops); in stm_register_device()
700 if (stm->major < 0) in stm_register_device()
703 device_initialize(&stm->dev); in stm_register_device()
704 stm->dev.devt = MKDEV(stm->major, 0); in stm_register_device()
705 stm->dev.class = &stm_class; in stm_register_device()
706 stm->dev.parent = parent; in stm_register_device()
707 stm->dev.release = stm_device_release; in stm_register_device()
709 mutex_init(&stm->link_mutex); in stm_register_device()
710 spin_lock_init(&stm->link_lock); in stm_register_device()
711 INIT_LIST_HEAD(&stm->link_list); in stm_register_device()
714 spin_lock_init(&stm->mc_lock); in stm_register_device()
715 mutex_init(&stm->policy_mutex); in stm_register_device()
716 stm->sw_nmasters = nmasters; in stm_register_device()
717 stm->owner = owner; in stm_register_device()
718 stm->data = stm_data; in stm_register_device()
719 stm_data->stm = stm; in stm_register_device()
721 err = kobject_set_name(&stm->dev.kobj, "%s", stm_data->name); in stm_register_device()
725 err = device_add(&stm->dev); in stm_register_device()
734 pm_runtime_no_callbacks(&stm->dev); in stm_register_device()
735 pm_runtime_use_autosuspend(&stm->dev); in stm_register_device()
736 pm_runtime_set_autosuspend_delay(&stm->dev, 2000); in stm_register_device()
737 pm_runtime_set_suspended(&stm->dev); in stm_register_device()
738 pm_runtime_enable(&stm->dev); in stm_register_device()
743 unregister_chrdev(stm->major, stm_data->name); in stm_register_device()
746 put_device(&stm->dev); in stm_register_device()
748 vfree(stm); in stm_register_device()
755 struct stm_device *stm);
759 struct stm_device *stm = stm_data->stm; in stm_unregister_device() local
763 pm_runtime_dont_use_autosuspend(&stm->dev); in stm_unregister_device()
764 pm_runtime_disable(&stm->dev); in stm_unregister_device()
766 mutex_lock(&stm->link_mutex); in stm_unregister_device()
767 list_for_each_entry_safe(src, iter, &stm->link_list, link_entry) { in stm_unregister_device()
768 ret = __stm_source_link_drop(src, stm); in stm_unregister_device()
778 mutex_unlock(&stm->link_mutex); in stm_unregister_device()
782 unregister_chrdev(stm->major, stm_data->name); in stm_unregister_device()
784 mutex_lock(&stm->policy_mutex); in stm_unregister_device()
785 if (stm->policy) in stm_unregister_device()
786 stp_policy_unbind(stm->policy); in stm_unregister_device()
787 mutex_unlock(&stm->policy_mutex); in stm_unregister_device()
789 for (i = stm->data->sw_start; i <= stm->data->sw_end; i++) in stm_unregister_device()
790 stp_master_free(stm, i); in stm_unregister_device()
792 device_unregister(&stm->dev); in stm_unregister_device()
793 stm_data->stm = NULL; in stm_unregister_device()
819 struct stm_device *stm) in stm_source_link_add() argument
824 mutex_lock(&stm->link_mutex); in stm_source_link_add()
825 spin_lock(&stm->link_lock); in stm_source_link_add()
829 rcu_assign_pointer(src->link, stm); in stm_source_link_add()
830 list_add_tail(&src->link_entry, &stm->link_list); in stm_source_link_add()
833 spin_unlock(&stm->link_lock); in stm_source_link_add()
834 mutex_unlock(&stm->link_mutex); in stm_source_link_add()
839 stp_policy_node_lookup(stm, id); in stm_source_link_add()
844 err = stm_output_assign(stm, src->data->nr_chans, in stm_source_link_add()
854 if (stm->data->link) in stm_source_link_add()
855 err = stm->data->link(stm->data, src->output.master, in stm_source_link_add()
868 stm_output_free(stm, &src->output); in stm_source_link_add()
871 mutex_lock(&stm->link_mutex); in stm_source_link_add()
872 spin_lock(&stm->link_lock); in stm_source_link_add()
879 spin_unlock(&stm->link_lock); in stm_source_link_add()
880 mutex_unlock(&stm->link_mutex); in stm_source_link_add()
896 struct stm_device *stm) in __stm_source_link_drop() argument
901 lockdep_assert_held(&stm->link_mutex); in __stm_source_link_drop()
904 spin_lock(&stm->link_lock); in __stm_source_link_drop()
913 if (link != stm) { in __stm_source_link_drop()
928 spin_unlock(&stm->link_lock); in __stm_source_link_drop()
938 if (stm->data->unlink) in __stm_source_link_drop()
939 stm->data->unlink(stm->data, src->output.master, in __stm_source_link_drop()
958 struct stm_device *stm; in stm_source_link_drop() local
968 stm = srcu_dereference(src->link, &stm_source_srcu); in stm_source_link_drop()
971 if (stm) { in stm_source_link_drop()
972 mutex_lock(&stm->link_mutex); in stm_source_link_drop()
973 ret = __stm_source_link_drop(src, stm); in stm_source_link_drop()
974 mutex_unlock(&stm->link_mutex); in stm_source_link_drop()
989 struct stm_device *stm; in stm_source_link_show() local
993 stm = srcu_dereference(src->link, &stm_source_srcu); in stm_source_link_show()
995 stm ? dev_name(&stm->dev) : "<none>"); in stm_source_link_show()
1124 struct stm_device *stm; in stm_source_write() local
1135 stm = srcu_dereference(src->link, &stm_source_srcu); in stm_source_write()
1136 if (stm) in stm_source_write()
1137 count = stm_write(stm->data, src->output.master, in stm_source_write()