Lines Matching +full:soc +full:- +full:level
5 * Tero Kristo <t-kristo@ti.com>
28 #include <linux/clk-provider.h>
31 #include "soc.h"
49 * actual amount of memory needed for the SoC
74 * prm_ll_data: function pointers to SoC-specific implementations of
90 for (i = 0; i < prcm_irq_setup->nr_regs; i++) { in omap_prcm_events_filter_priority()
92 events[i] & prcm_irq_setup->priority_mask[i]; in omap_prcm_events_filter_priority()
103 * done by the SoC specific individual handlers.
111 int nr_irq = prcm_irq_setup->nr_regs * 32; in omap_prcm_irq_handler()
114 * If we are suspended, mask all interrupts from PRCM level, in omap_prcm_irq_handler()
116 * re-enable the interrupts, at which point the in omap_prcm_irq_handler()
123 if (prcm_irq_setup->suspended) { in omap_prcm_irq_handler()
124 prcm_irq_setup->save_and_clear_irqen(prcm_irq_setup->saved_mask); in omap_prcm_irq_handler()
125 prcm_irq_setup->suspend_save_flag = true; in omap_prcm_irq_handler()
132 while (!prcm_irq_setup->suspended) { in omap_prcm_irq_handler()
133 prcm_irq_setup->read_pending_irqs(pending); in omap_prcm_irq_handler()
148 generic_handle_irq(prcm_irq_setup->base_irq + virtirq); in omap_prcm_irq_handler()
152 generic_handle_irq(prcm_irq_setup->base_irq + virtirq); in omap_prcm_irq_handler()
154 if (chip->irq_ack) in omap_prcm_irq_handler()
155 chip->irq_ack(&desc->irq_data); in omap_prcm_irq_handler()
156 if (chip->irq_eoi) in omap_prcm_irq_handler()
157 chip->irq_eoi(&desc->irq_data); in omap_prcm_irq_handler()
158 chip->irq_unmask(&desc->irq_data); in omap_prcm_irq_handler()
160 prcm_irq_setup->ocp_barrier(); /* avoid spurious IRQs */ in omap_prcm_irq_handler()
166 * omap_prcm_event_to_irq - given a PRCM event name, returns the
168 * @name: name of the PRCM interrupt bit to look up - see struct omap_prcm_irq
171 * or -ENOENT upon failure.
178 return -ENOENT; in omap_prcm_event_to_irq()
180 for (i = 0; i < prcm_irq_setup->nr_irqs; i++) in omap_prcm_event_to_irq()
181 if (!strcmp(prcm_irq_setup->irqs[i].name, name)) in omap_prcm_event_to_irq()
182 return prcm_irq_setup->base_irq + in omap_prcm_event_to_irq()
183 prcm_irq_setup->irqs[i].offset; in omap_prcm_event_to_irq()
185 return -ENOENT; in omap_prcm_event_to_irq()
189 * omap_prcm_irq_cleanup - reverses memory allocated and other steps
205 for (i = 0; i < prcm_irq_setup->nr_regs; i++) { in omap_prcm_irq_cleanup()
215 kfree(prcm_irq_setup->saved_mask); in omap_prcm_irq_cleanup()
216 prcm_irq_setup->saved_mask = NULL; in omap_prcm_irq_cleanup()
218 kfree(prcm_irq_setup->priority_mask); in omap_prcm_irq_cleanup()
219 prcm_irq_setup->priority_mask = NULL; in omap_prcm_irq_cleanup()
221 irq = prcm_irq_setup->irq; in omap_prcm_irq_cleanup()
224 if (prcm_irq_setup->base_irq > 0) in omap_prcm_irq_cleanup()
225 irq_free_descs(prcm_irq_setup->base_irq, in omap_prcm_irq_cleanup()
226 prcm_irq_setup->nr_regs * 32); in omap_prcm_irq_cleanup()
227 prcm_irq_setup->base_irq = 0; in omap_prcm_irq_cleanup()
232 prcm_irq_setup->suspended = true; in omap_prcm_irq_prepare()
237 prcm_irq_setup->suspended = false; in omap_prcm_irq_complete()
240 if (!prcm_irq_setup->suspend_save_flag) in omap_prcm_irq_complete()
243 prcm_irq_setup->suspend_save_flag = false; in omap_prcm_irq_complete()
246 * Re-enable all masked PRCM irq sources, this causes the PRCM in omap_prcm_irq_complete()
250 prcm_irq_setup->restore_irqen(prcm_irq_setup->saved_mask); in omap_prcm_irq_complete()
254 * omap_prcm_register_chain_handler - initializes the prcm chained interrupt
260 * Returns 0 upon success, -EINVAL if called twice or if invalid
261 * arguments are passed, or -ENOMEM on any other error.
272 return -EINVAL; in omap_prcm_register_chain_handler()
274 nr_regs = irq_setup->nr_regs; in omap_prcm_register_chain_handler()
278 return -EINVAL; in omap_prcm_register_chain_handler()
283 return -EINVAL; in omap_prcm_register_chain_handler()
289 prcm_irq_setup->saved_mask = kcalloc(nr_regs, sizeof(u32), in omap_prcm_register_chain_handler()
291 prcm_irq_setup->priority_mask = kcalloc(nr_regs, sizeof(u32), in omap_prcm_register_chain_handler()
294 if (!prcm_irq_chips || !prcm_irq_setup->saved_mask || in omap_prcm_register_chain_handler()
295 !prcm_irq_setup->priority_mask) in omap_prcm_register_chain_handler()
300 for (i = 0; i < irq_setup->nr_irqs; i++) { in omap_prcm_register_chain_handler()
301 offset = irq_setup->irqs[i].offset; in omap_prcm_register_chain_handler()
303 if (irq_setup->irqs[i].priority) in omap_prcm_register_chain_handler()
304 irq_setup->priority_mask[offset >> 5] |= in omap_prcm_register_chain_handler()
308 irq = irq_setup->irq; in omap_prcm_register_chain_handler()
311 irq_setup->base_irq = irq_alloc_descs(-1, 0, irq_setup->nr_regs * 32, in omap_prcm_register_chain_handler()
314 if (irq_setup->base_irq < 0) { in omap_prcm_register_chain_handler()
316 irq_setup->base_irq); in omap_prcm_register_chain_handler()
320 for (i = 0; i < irq_setup->nr_regs; i++) { in omap_prcm_register_chain_handler()
322 irq_setup->base_irq + i * 32, prm_base.va, in omap_prcm_register_chain_handler()
329 ct = gc->chip_types; in omap_prcm_register_chain_handler()
330 ct->chip.irq_ack = irq_gc_ack_set_bit; in omap_prcm_register_chain_handler()
331 ct->chip.irq_mask = irq_gc_mask_clr_bit; in omap_prcm_register_chain_handler()
332 ct->chip.irq_unmask = irq_gc_mask_set_bit; in omap_prcm_register_chain_handler()
334 ct->regs.ack = irq_setup->ack + i * 4; in omap_prcm_register_chain_handler()
335 ct->regs.mask = irq_setup->mask + i * 4; in omap_prcm_register_chain_handler()
342 omap_pcs_legacy_init(irq, irq_setup->reconfigure_io_chain); in omap_prcm_register_chain_handler()
348 return -ENOMEM; in omap_prcm_register_chain_handler()
352 * omap2_set_globals_prm - set the PRM base address (for early use)
363 * prm_read_reset_sources - return the sources of the SoC's last reset
366 * SoC to reset. The low-level per-SoC functions called by this
367 * function remap the SoC-specific reset source bits into an
368 * OMAP-common set of reset source bits, defined in
369 * arch/arm/mach-omap2/prm.h. Returns the standardized reset source
371 * OMAP_UNKNOWN_RST_SRC_ID_SHIFT) if no low-level read_reset_sources()
378 if (prm_ll_data->read_reset_sources) in prm_read_reset_sources()
379 ret = prm_ll_data->read_reset_sources(); in prm_read_reset_sources()
387 * prm_was_any_context_lost_old - was device context lost? (old API)
395 * callers need to use a less-SoC-dependent way to identify hardware
402 if (prm_ll_data->was_any_context_lost_old) in prm_was_any_context_lost_old()
403 ret = prm_ll_data->was_any_context_lost_old(part, inst, idx); in prm_was_any_context_lost_old()
412 * prm_clear_context_lost_flags_old - clear context loss flags (old API)
419 * need to use a less-SoC-dependent way to identify hardware IP
424 if (prm_ll_data->clear_context_loss_flags_old) in prm_clear_context_loss_flags_old()
425 prm_ll_data->clear_context_loss_flags_old(part, inst, idx); in prm_clear_context_loss_flags_old()
432 * omap_prm_assert_hardreset - assert hardreset for an IP block
442 if (!prm_ll_data->assert_hardreset) { in omap_prm_assert_hardreset()
445 return -EINVAL; in omap_prm_assert_hardreset()
448 return prm_ll_data->assert_hardreset(shift, part, prm_mod, offset); in omap_prm_assert_hardreset()
452 * omap_prm_deassert_hardreset - deassert hardreset for an IP block
465 if (!prm_ll_data->deassert_hardreset) { in omap_prm_deassert_hardreset()
468 return -EINVAL; in omap_prm_deassert_hardreset()
471 return prm_ll_data->deassert_hardreset(shift, st_shift, part, prm_mod, in omap_prm_deassert_hardreset()
476 * omap_prm_is_hardreset_asserted - check the hardreset status for an IP block
486 if (!prm_ll_data->is_hardreset_asserted) { in omap_prm_is_hardreset_asserted()
489 return -EINVAL; in omap_prm_is_hardreset_asserted()
492 return prm_ll_data->is_hardreset_asserted(shift, part, prm_mod, offset); in omap_prm_is_hardreset_asserted()
496 * omap_prm_reconfigure_io_chain - clear latches and reconfigure I/O chain
498 * Clear any previously-latched I/O wakeup events and ensure that the
500 * Calls SoC specific I/O chain reconfigure function if available,
505 if (!prcm_irq_setup || !prcm_irq_setup->reconfigure_io_chain) in omap_prm_reconfigure_io_chain()
508 prcm_irq_setup->reconfigure_io_chain(); in omap_prm_reconfigure_io_chain()
512 * omap_prm_reset_system - trigger global SW reset
514 * Triggers SoC specific global warm reset to reboot the device.
518 if (!prm_ll_data->reset_system) { in omap_prm_reset_system()
524 prm_ll_data->reset_system(); in omap_prm_reset_system()
533 * omap_prm_clear_mod_irqs - clear wake-up events from PRCM interrupt
539 * Uses SoC specific implementation to do the actual wakeup status
544 if (!prm_ll_data->clear_mod_irqs) { in omap_prm_clear_mod_irqs()
547 return -EINVAL; in omap_prm_clear_mod_irqs()
550 return prm_ll_data->clear_mod_irqs(module, regs, wkst_mask); in omap_prm_clear_mod_irqs()
554 * omap_prm_vp_check_txdone - check voltage processor TX done status
557 * Returns non-zero if a transmission has completed, 0 otherwise.
561 if (!prm_ll_data->vp_check_txdone) { in omap_prm_vp_check_txdone()
567 return prm_ll_data->vp_check_txdone(vp_id); in omap_prm_vp_check_txdone()
571 * omap_prm_vp_clear_txdone - clears voltage processor TX done status
578 if (!prm_ll_data->vp_clear_txdone) { in omap_prm_vp_clear_txdone()
584 prm_ll_data->vp_clear_txdone(vp_id); in omap_prm_vp_clear_txdone()
588 * prm_register - register per-SoC low-level data with the PRM
589 * @pld: low-level per-SoC OMAP PRM data & function pointers to register
591 * Register per-SoC low-level OMAP PRM data and function pointers with
594 * it returns successfully. Returns 0 upon success, -EINVAL if @pld
595 * is NULL, or -EEXIST if prm_register() has already been called
601 return -EINVAL; in prm_register()
604 return -EEXIST; in prm_register()
612 * prm_unregister - unregister per-SoC low-level data & function pointers
613 * @pld: low-level per-SoC OMAP PRM data & function pointers to unregister
615 * Unregister per-SoC low-level OMAP PRM data and function pointers
619 * -EINVAL if @pld is NULL or if @pld does not match the struct
625 return -EINVAL; in prm_unregister()
648 .offset = -OMAP3430_IVA2_MOD,
710 { .compatible = "ti,am3-prcm", .data = &am3_prm_data },
713 { .compatible = "ti,am4-prcm", .data = &am4_prm_data },
716 { .compatible = "ti,dm814-prcm", .data = &am3_prm_data },
717 { .compatible = "ti,dm814-pllss", .data = &dm814_pllss_data },
718 { .compatible = "ti,dm816-prcm", .data = &am3_prm_data },
721 { .compatible = "ti,omap2-prcm", .data = &omap2_prm_data },
724 { .compatible = "ti,omap3-prm", .data = &omap3_prm_data },
727 { .compatible = "ti,omap4-prm", .data = &omap4_prm_data },
728 { .compatible = "ti,omap4-scrm", .data = &scrm_data },
731 { .compatible = "ti,omap5-prm", .data = &omap5_prm_data },
732 { .compatible = "ti,omap5-scrm", .data = &scrm_data },
735 { .compatible = "ti,dra7-prm", .data = &dra7_prm_data },
741 * omap2_prm_base_init - initialize iomappings for the PRM driver
756 data = (struct omap_prcm_init_data *)match->data; in omap2_prm_base_init()
762 data->mem = ioremap(res.start, resource_size(&res)); in omap2_prm_base_init()
764 if (data->index == TI_CLKM_PRM) { in omap2_prm_base_init()
765 prm_base.va = data->mem + data->offset; in omap2_prm_base_init()
766 prm_base.pa = res.start + data->offset; in omap2_prm_base_init()
769 data->np = np; in omap2_prm_base_init()
771 if (data->init) in omap2_prm_base_init()
772 data->init(data); in omap2_prm_base_init()
790 * omap_prcm_init - low level init for the PRCM drivers
792 * Initializes the low level clock infrastructure for PRCM drivers.
803 data = match->data; in omap_prcm_init()
805 ret = omap2_clk_provider_init(np, data->index, NULL, data->mem); in omap_prcm_init()
817 if (prm_ll_data->late_init) in prm_late_init()
818 return prm_ll_data->late_init(); in prm_late_init()