Lines Matching refs:sachip
194 static int sa1111_map_irq(struct sa1111 *sachip, irq_hw_number_t hwirq) in sa1111_map_irq() argument
196 return irq_create_mapping(sachip->irqdomain, hwirq); in sa1111_map_irq()
215 struct sa1111 *sachip = irq_desc_get_handler_data(desc); in sa1111_irq_handler() local
217 void __iomem *mapbase = sachip->base + SA1111_INTC; in sa1111_irq_handler()
233 irqdomain = sachip->irqdomain; in sa1111_irq_handler()
263 struct sa1111 *sachip = irq_data_get_irq_chip_data(d); in sa1111_mask_irq() local
264 void __iomem *mapbase = sachip->base + SA1111_INTC + sa1111_irqbank(d); in sa1111_mask_irq()
274 struct sa1111 *sachip = irq_data_get_irq_chip_data(d); in sa1111_unmask_irq() local
275 void __iomem *mapbase = sachip->base + SA1111_INTC + sa1111_irqbank(d); in sa1111_unmask_irq()
292 struct sa1111 *sachip = irq_data_get_irq_chip_data(d); in sa1111_retrigger_irq() local
293 void __iomem *mapbase = sachip->base + SA1111_INTC + sa1111_irqbank(d); in sa1111_retrigger_irq()
313 struct sa1111 *sachip = irq_data_get_irq_chip_data(d); in sa1111_type_irq() local
314 void __iomem *mapbase = sachip->base + SA1111_INTC + sa1111_irqbank(d); in sa1111_type_irq()
336 struct sa1111 *sachip = irq_data_get_irq_chip_data(d); in sa1111_wake_irq() local
337 void __iomem *mapbase = sachip->base + SA1111_INTC + sa1111_irqbank(d); in sa1111_wake_irq()
363 struct sa1111 *sachip = d->host_data; in sa1111_irqdomain_map() local
369 irq_set_chip_data(irq, sachip); in sa1111_irqdomain_map()
381 static int sa1111_setup_irq(struct sa1111 *sachip, unsigned irq_base) in sa1111_setup_irq() argument
383 void __iomem *irqbase = sachip->base + SA1111_INTC; in sa1111_setup_irq()
389 request_mem_region(sachip->phys + SA1111_INTC, 512, "irq"); in sa1111_setup_irq()
393 dev_err(sachip->dev, "unable to allocate %u irqs: %d\n", in sa1111_setup_irq()
400 sachip->irq_base = ret; in sa1111_setup_irq()
421 sachip->irqdomain = irq_domain_add_linear(NULL, SA1111_IRQ_NR, in sa1111_setup_irq()
423 sachip); in sa1111_setup_irq()
424 if (!sachip->irqdomain) { in sa1111_setup_irq()
425 irq_free_descs(sachip->irq_base, SA1111_IRQ_NR); in sa1111_setup_irq()
429 irq_domain_associate_many(sachip->irqdomain, in sa1111_setup_irq()
430 sachip->irq_base + IRQ_GPAIN0, in sa1111_setup_irq()
432 irq_domain_associate_many(sachip->irqdomain, in sa1111_setup_irq()
433 sachip->irq_base + AUDXMTDMADONEA, in sa1111_setup_irq()
440 irq_set_irq_type(sachip->irq, IRQ_TYPE_EDGE_RISING); in sa1111_setup_irq()
441 irq_set_chained_handler_and_data(sachip->irq, sa1111_irq_handler, in sa1111_setup_irq()
442 sachip); in sa1111_setup_irq()
444 dev_info(sachip->dev, "Providing IRQ%u-%u\n", in sa1111_setup_irq()
445 sachip->irq_base, sachip->irq_base + SA1111_IRQ_NR - 1); in sa1111_setup_irq()
450 static void sa1111_remove_irq(struct sa1111 *sachip) in sa1111_remove_irq() argument
452 struct irq_domain *domain = sachip->irqdomain; in sa1111_remove_irq()
453 void __iomem *irqbase = sachip->base + SA1111_INTC; in sa1111_remove_irq()
462 irq_set_chained_handler_and_data(sachip->irq, NULL, NULL); in sa1111_remove_irq()
467 release_mem_region(sachip->phys + SA1111_INTC, 512); in sa1111_remove_irq()
483 static void __iomem *sa1111_gpio_map_reg(struct sa1111 *sachip, unsigned offset) in sa1111_gpio_map_reg() argument
485 void __iomem *reg = sachip->base + SA1111_GPIO; in sa1111_gpio_map_reg()
519 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_get_direction() local
520 void __iomem *reg = sa1111_gpio_map_reg(sachip, offset); in sa1111_gpio_get_direction()
528 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_direction_input() local
530 void __iomem *reg = sa1111_gpio_map_reg(sachip, offset); in sa1111_gpio_direction_input()
533 spin_lock_irqsave(&sachip->lock, flags); in sa1111_gpio_direction_input()
536 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_gpio_direction_input()
544 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_direction_output() local
546 void __iomem *reg = sa1111_gpio_map_reg(sachip, offset); in sa1111_gpio_direction_output()
549 spin_lock_irqsave(&sachip->lock, flags); in sa1111_gpio_direction_output()
554 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_gpio_direction_output()
561 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_get() local
562 void __iomem *reg = sa1111_gpio_map_reg(sachip, offset); in sa1111_gpio_get()
570 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_set() local
572 void __iomem *reg = sa1111_gpio_map_reg(sachip, offset); in sa1111_gpio_set()
575 spin_lock_irqsave(&sachip->lock, flags); in sa1111_gpio_set()
578 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_gpio_set()
584 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_set_multiple() local
586 void __iomem *reg = sachip->base + SA1111_GPIO; in sa1111_gpio_set_multiple()
592 spin_lock_irqsave(&sachip->lock, flags); in sa1111_gpio_set_multiple()
599 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_gpio_set_multiple()
604 struct sa1111 *sachip = gc_to_sa1111(gc); in sa1111_gpio_to_irq() local
606 return sa1111_map_irq(sachip, offset); in sa1111_gpio_to_irq()
609 static int sa1111_setup_gpios(struct sa1111 *sachip) in sa1111_setup_gpios() argument
611 sachip->gc.label = "sa1111"; in sa1111_setup_gpios()
612 sachip->gc.parent = sachip->dev; in sa1111_setup_gpios()
613 sachip->gc.owner = THIS_MODULE; in sa1111_setup_gpios()
614 sachip->gc.get_direction = sa1111_gpio_get_direction; in sa1111_setup_gpios()
615 sachip->gc.direction_input = sa1111_gpio_direction_input; in sa1111_setup_gpios()
616 sachip->gc.direction_output = sa1111_gpio_direction_output; in sa1111_setup_gpios()
617 sachip->gc.get = sa1111_gpio_get; in sa1111_setup_gpios()
618 sachip->gc.set = sa1111_gpio_set; in sa1111_setup_gpios()
619 sachip->gc.set_multiple = sa1111_gpio_set_multiple; in sa1111_setup_gpios()
620 sachip->gc.to_irq = sa1111_gpio_to_irq; in sa1111_setup_gpios()
621 sachip->gc.base = -1; in sa1111_setup_gpios()
622 sachip->gc.ngpio = 18; in sa1111_setup_gpios()
624 return devm_gpiochip_add_data(sachip->dev, &sachip->gc, sachip); in sa1111_setup_gpios()
641 static void sa1111_wake(struct sa1111 *sachip) in sa1111_wake() argument
645 spin_lock_irqsave(&sachip->lock, flags); in sa1111_wake()
647 clk_enable(sachip->clk); in sa1111_wake()
652 r = readl_relaxed(sachip->base + SA1111_SKCR); in sa1111_wake()
654 writel_relaxed(r, sachip->base + SA1111_SKCR); in sa1111_wake()
656 writel_relaxed(r, sachip->base + SA1111_SKCR); in sa1111_wake()
668 writel_relaxed(r, sachip->base + SA1111_SKCR); in sa1111_wake()
679 writel_relaxed(0, sachip->base + SA1111_SKPCR); in sa1111_wake()
681 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_wake()
701 sa1111_configure_smc(struct sa1111 *sachip, int sdram, unsigned int drac, in sa1111_configure_smc() argument
709 writel_relaxed(smcr, sachip->base + SA1111_SMCR); in sa1111_configure_smc()
716 if (sachip->dev->dma_mask) in sa1111_configure_smc()
717 *sachip->dev->dma_mask &= sa1111_dma_mask[drac >> 2]; in sa1111_configure_smc()
719 sachip->dev->coherent_dma_mask &= sa1111_dma_mask[drac >> 2]; in sa1111_configure_smc()
731 sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent, in sa1111_init_one_child() argument
747 dev->dev.parent = sachip->dev; in sa1111_init_one_child()
750 dev->res.start = sachip->phys + info->offset; in sa1111_init_one_child()
754 dev->mapbase = sachip->base + info->offset; in sa1111_init_one_child()
764 if (info->dma && sachip->dev->dma_mask) { in sa1111_init_one_child()
765 dev->dma_mask = *sachip->dev->dma_mask; in sa1111_init_one_child()
767 dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask; in sa1111_init_one_child()
772 dev_err(sachip->dev, "failed to allocate resource for %s\n", in sa1111_init_one_child()
806 struct sa1111 *sachip; in __sa1111_probe() local
814 sachip = devm_kzalloc(me, sizeof(struct sa1111), GFP_KERNEL); in __sa1111_probe()
815 if (!sachip) in __sa1111_probe()
818 sachip->clk = devm_clk_get(me, "SA1111_CLK"); in __sa1111_probe()
819 if (IS_ERR(sachip->clk)) in __sa1111_probe()
820 return PTR_ERR(sachip->clk); in __sa1111_probe()
822 ret = clk_prepare(sachip->clk); in __sa1111_probe()
826 spin_lock_init(&sachip->lock); in __sa1111_probe()
828 sachip->dev = me; in __sa1111_probe()
829 dev_set_drvdata(sachip->dev, sachip); in __sa1111_probe()
831 sachip->pdata = pd; in __sa1111_probe()
832 sachip->phys = mem->start; in __sa1111_probe()
833 sachip->irq = irq; in __sa1111_probe()
839 sachip->base = ioremap(mem->start, PAGE_SIZE * 2); in __sa1111_probe()
840 if (!sachip->base) { in __sa1111_probe()
848 id = readl_relaxed(sachip->base + SA1111_SKID); in __sa1111_probe()
861 sa1111_wake(sachip); in __sa1111_probe()
867 ret = sa1111_setup_irq(sachip, pd->irq_base); in __sa1111_probe()
872 ret = sa1111_setup_gpios(sachip); in __sa1111_probe()
887 sa1111_configure_smc(sachip, 1, in __sa1111_probe()
896 val = readl_relaxed(sachip->base + SA1111_SKPCR); in __sa1111_probe()
897 writel_relaxed(val | SKPCR_DCLKEN, sachip->base + SA1111_SKPCR); in __sa1111_probe()
906 g_sa1111 = sachip; in __sa1111_probe()
914 sa1111_init_one_child(sachip, mem, &sa1111_devices[i]); in __sa1111_probe()
919 sa1111_remove_irq(sachip); in __sa1111_probe()
921 clk_disable(sachip->clk); in __sa1111_probe()
923 iounmap(sachip->base); in __sa1111_probe()
925 clk_unprepare(sachip->clk); in __sa1111_probe()
940 static void __sa1111_remove(struct sa1111 *sachip) in __sa1111_remove() argument
942 device_for_each_child(sachip->dev, NULL, sa1111_remove_one); in __sa1111_remove()
944 sa1111_remove_irq(sachip); in __sa1111_remove()
946 clk_disable(sachip->clk); in __sa1111_remove()
947 clk_unprepare(sachip->clk); in __sa1111_remove()
949 iounmap(sachip->base); in __sa1111_remove()
977 struct sa1111 *sachip = dev_get_drvdata(dev); in sa1111_suspend_noirq() local
986 sachip->saved_state = save; in sa1111_suspend_noirq()
988 spin_lock_irqsave(&sachip->lock, flags); in sa1111_suspend_noirq()
993 base = sachip->base; in sa1111_suspend_noirq()
1001 writel_relaxed(0, sachip->base + SA1111_SKPWM0); in sa1111_suspend_noirq()
1002 writel_relaxed(0, sachip->base + SA1111_SKPWM1); in sa1111_suspend_noirq()
1004 base = sachip->base + SA1111_INTC; in sa1111_suspend_noirq()
1017 val = readl_relaxed(sachip->base + SA1111_SKCR); in sa1111_suspend_noirq()
1018 writel_relaxed(val | SKCR_SLEEP, sachip->base + SA1111_SKCR); in sa1111_suspend_noirq()
1020 clk_disable(sachip->clk); in sa1111_suspend_noirq()
1022 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_suspend_noirq()
1042 struct sa1111 *sachip = dev_get_drvdata(dev); in sa1111_resume_noirq() local
1047 save = sachip->saved_state; in sa1111_resume_noirq()
1055 id = readl_relaxed(sachip->base + SA1111_SKID); in sa1111_resume_noirq()
1057 __sa1111_remove(sachip); in sa1111_resume_noirq()
1066 sa1111_wake(sachip); in sa1111_resume_noirq()
1077 spin_lock_irqsave(&sachip->lock, flags); in sa1111_resume_noirq()
1079 writel_relaxed(0, sachip->base + SA1111_INTC + SA1111_INTEN0); in sa1111_resume_noirq()
1080 writel_relaxed(0, sachip->base + SA1111_INTC + SA1111_INTEN1); in sa1111_resume_noirq()
1082 base = sachip->base; in sa1111_resume_noirq()
1090 base = sachip->base + SA1111_INTC; in sa1111_resume_noirq()
1100 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_resume_noirq()
1102 sachip->saved_state = NULL; in sa1111_resume_noirq()
1130 struct sa1111 *sachip = platform_get_drvdata(pdev); in sa1111_remove() local
1132 if (sachip) { in sa1111_remove()
1134 kfree(sachip->saved_state); in sa1111_remove()
1135 sachip->saved_state = NULL; in sa1111_remove()
1137 __sa1111_remove(sachip); in sa1111_remove()
1181 static unsigned int __sa1111_pll_clock(struct sa1111 *sachip) in __sa1111_pll_clock() argument
1185 skcdr = readl_relaxed(sachip->base + SA1111_SKCDR); in __sa1111_pll_clock()
1205 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_pll_clock() local
1207 return __sa1111_pll_clock(sachip); in sa1111_pll_clock()
1221 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_select_audio_mode() local
1225 spin_lock_irqsave(&sachip->lock, flags); in sa1111_select_audio_mode()
1227 val = readl_relaxed(sachip->base + SA1111_SKCR); in sa1111_select_audio_mode()
1233 writel_relaxed(val, sachip->base + SA1111_SKCR); in sa1111_select_audio_mode()
1235 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_select_audio_mode()
1246 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_set_audio_rate() local
1252 div = (__sa1111_pll_clock(sachip) / 256 + rate / 2) / rate; in sa1111_set_audio_rate()
1258 writel_relaxed(div - 1, sachip->base + SA1111_SKAUD); in sa1111_set_audio_rate()
1270 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_get_audio_rate() local
1276 div = readl_relaxed(sachip->base + SA1111_SKAUD) + 1; in sa1111_get_audio_rate()
1278 return __sa1111_pll_clock(sachip) / (256 * div); in sa1111_get_audio_rate()
1292 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_enable_device() local
1297 if (sachip->pdata && sachip->pdata->enable) in sa1111_enable_device()
1298 ret = sachip->pdata->enable(sachip->pdata->data, sadev->devid); in sa1111_enable_device()
1301 spin_lock_irqsave(&sachip->lock, flags); in sa1111_enable_device()
1302 val = readl_relaxed(sachip->base + SA1111_SKPCR); in sa1111_enable_device()
1303 writel_relaxed(val | sadev->skpcr_mask, sachip->base + SA1111_SKPCR); in sa1111_enable_device()
1304 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_enable_device()
1316 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_disable_device() local
1320 spin_lock_irqsave(&sachip->lock, flags); in sa1111_disable_device()
1321 val = readl_relaxed(sachip->base + SA1111_SKPCR); in sa1111_disable_device()
1322 writel_relaxed(val & ~sadev->skpcr_mask, sachip->base + SA1111_SKPCR); in sa1111_disable_device()
1323 spin_unlock_irqrestore(&sachip->lock, flags); in sa1111_disable_device()
1325 if (sachip->pdata && sachip->pdata->disable) in sa1111_disable_device()
1326 sachip->pdata->disable(sachip->pdata->data, sadev->devid); in sa1111_disable_device()
1332 struct sa1111 *sachip = sa1111_chip_driver(sadev); in sa1111_get_irq() local
1335 return sa1111_map_irq(sachip, sadev->hwirq[num]); in sa1111_get_irq()