Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

clk: actions: Add Actions Semi S900 SoC Reset Management Unit support

Add Reset Management Unit (RMU) support for Actions Semi S900 SoC.

Signed-off-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>

authored by

Manivannan Sadhasivam and committed by
Stephen Boyd
5ddf0cdf c4dd4a2e

+82
+82
drivers/clk/actions/owl-s900.c
··· 19 19 #include "owl-gate.h" 20 20 #include "owl-mux.h" 21 21 #include "owl-pll.h" 22 + #include "owl-reset.h" 22 23 23 24 #include <dt-bindings/clock/actions,s900-cmu.h> 25 + #include <dt-bindings/reset/actions,s900-reset.h> 24 26 25 27 #define CMU_COREPLL (0x0000) 26 28 #define CMU_DEVPLL (0x0004) ··· 686 684 .num = CLK_NR_CLKS, 687 685 }; 688 686 687 + static const struct owl_reset_map s900_resets[] = { 688 + [RESET_DMAC] = { CMU_DEVRST0, BIT(0) }, 689 + [RESET_SRAMI] = { CMU_DEVRST0, BIT(1) }, 690 + [RESET_DDR_CTL_PHY] = { CMU_DEVRST0, BIT(2) }, 691 + [RESET_NANDC0] = { CMU_DEVRST0, BIT(3) }, 692 + [RESET_SD0] = { CMU_DEVRST0, BIT(4) }, 693 + [RESET_SD1] = { CMU_DEVRST0, BIT(5) }, 694 + [RESET_PCM1] = { CMU_DEVRST0, BIT(6) }, 695 + [RESET_DE] = { CMU_DEVRST0, BIT(7) }, 696 + [RESET_LVDS] = { CMU_DEVRST0, BIT(8) }, 697 + [RESET_SD2] = { CMU_DEVRST0, BIT(9) }, 698 + [RESET_DSI] = { CMU_DEVRST0, BIT(10) }, 699 + [RESET_CSI0] = { CMU_DEVRST0, BIT(11) }, 700 + [RESET_BISP_AXI] = { CMU_DEVRST0, BIT(12) }, 701 + [RESET_CSI1] = { CMU_DEVRST0, BIT(13) }, 702 + [RESET_GPIO] = { CMU_DEVRST0, BIT(15) }, 703 + [RESET_EDP] = { CMU_DEVRST0, BIT(16) }, 704 + [RESET_AUDIO] = { CMU_DEVRST0, BIT(17) }, 705 + [RESET_PCM0] = { CMU_DEVRST0, BIT(18) }, 706 + [RESET_HDE] = { CMU_DEVRST0, BIT(21) }, 707 + [RESET_GPU3D_PA] = { CMU_DEVRST0, BIT(22) }, 708 + [RESET_IMX] = { CMU_DEVRST0, BIT(23) }, 709 + [RESET_SE] = { CMU_DEVRST0, BIT(24) }, 710 + [RESET_NANDC1] = { CMU_DEVRST0, BIT(25) }, 711 + [RESET_SD3] = { CMU_DEVRST0, BIT(26) }, 712 + [RESET_GIC] = { CMU_DEVRST0, BIT(27) }, 713 + [RESET_GPU3D_PB] = { CMU_DEVRST0, BIT(28) }, 714 + [RESET_DDR_CTL_PHY_AXI] = { CMU_DEVRST0, BIT(29) }, 715 + [RESET_CMU_DDR] = { CMU_DEVRST0, BIT(30) }, 716 + [RESET_DMM] = { CMU_DEVRST0, BIT(31) }, 717 + [RESET_USB2HUB] = { CMU_DEVRST1, BIT(0) }, 718 + [RESET_USB2HSIC] = { CMU_DEVRST1, BIT(1) }, 719 + [RESET_HDMI] = { CMU_DEVRST1, BIT(2) }, 720 + [RESET_HDCP2TX] = { CMU_DEVRST1, BIT(3) }, 721 + [RESET_UART6] = { CMU_DEVRST1, BIT(4) }, 722 + [RESET_UART0] = { CMU_DEVRST1, BIT(5) }, 723 + [RESET_UART1] = { CMU_DEVRST1, BIT(6) }, 724 + [RESET_UART2] = { CMU_DEVRST1, BIT(7) }, 725 + [RESET_SPI0] = { CMU_DEVRST1, BIT(8) }, 726 + [RESET_SPI1] = { CMU_DEVRST1, BIT(9) }, 727 + [RESET_SPI2] = { CMU_DEVRST1, BIT(10) }, 728 + [RESET_SPI3] = { CMU_DEVRST1, BIT(11) }, 729 + [RESET_I2C0] = { CMU_DEVRST1, BIT(12) }, 730 + [RESET_I2C1] = { CMU_DEVRST1, BIT(13) }, 731 + [RESET_USB3] = { CMU_DEVRST1, BIT(14) }, 732 + [RESET_UART3] = { CMU_DEVRST1, BIT(15) }, 733 + [RESET_UART4] = { CMU_DEVRST1, BIT(16) }, 734 + [RESET_UART5] = { CMU_DEVRST1, BIT(17) }, 735 + [RESET_I2C2] = { CMU_DEVRST1, BIT(18) }, 736 + [RESET_I2C3] = { CMU_DEVRST1, BIT(19) }, 737 + [RESET_ETHERNET] = { CMU_DEVRST1, BIT(20) }, 738 + [RESET_CHIPID] = { CMU_DEVRST1, BIT(21) }, 739 + [RESET_I2C4] = { CMU_DEVRST1, BIT(22) }, 740 + [RESET_I2C5] = { CMU_DEVRST1, BIT(23) }, 741 + [RESET_CPU_SCNT] = { CMU_DEVRST1, BIT(30) } 742 + }; 743 + 689 744 static struct owl_clk_desc s900_clk_desc = { 690 745 .clks = s900_clks, 691 746 .num_clks = ARRAY_SIZE(s900_clks), 692 747 693 748 .hw_clks = &s900_hw_clks, 749 + 750 + .resets = s900_resets, 751 + .num_resets = ARRAY_SIZE(s900_resets), 694 752 }; 695 753 696 754 static int s900_clk_probe(struct platform_device *pdev) 697 755 { 698 756 struct owl_clk_desc *desc; 757 + struct owl_reset *reset; 758 + int ret; 699 759 700 760 desc = &s900_clk_desc; 701 761 owl_clk_regmap_init(pdev, desc); 762 + 763 + /* 764 + * FIXME: Reset controller registration should be moved to 765 + * common code, once all SoCs of Owl family supports it. 766 + */ 767 + reset = devm_kzalloc(&pdev->dev, sizeof(*reset), GFP_KERNEL); 768 + if (!reset) 769 + return -ENOMEM; 770 + 771 + reset->rcdev.of_node = pdev->dev.of_node; 772 + reset->rcdev.ops = &owl_reset_ops; 773 + reset->rcdev.nr_resets = desc->num_resets; 774 + reset->reset_map = desc->resets; 775 + reset->regmap = desc->regmap; 776 + 777 + ret = devm_reset_controller_register(&pdev->dev, &reset->rcdev); 778 + if (ret) 779 + dev_err(&pdev->dev, "Failed to register reset controller\n"); 702 780 703 781 return owl_clk_probe(&pdev->dev, desc->hw_clks); 704 782 }