162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * PSC clock descriptions for TI DA830/OMAP-L137/AM17XX
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright (C) 2018 David Lechner <david@lechnology.com>
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/clk-provider.h>
962306a36Sopenharmony_ci#include <linux/clk.h>
1062306a36Sopenharmony_ci#include <linux/clkdev.h>
1162306a36Sopenharmony_ci#include <linux/init.h>
1262306a36Sopenharmony_ci#include <linux/kernel.h>
1362306a36Sopenharmony_ci#include <linux/types.h>
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci#include "psc.h"
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ciLPSC_CLKDEV1(aemif_clkdev,	NULL,	"ti-aemif");
1862306a36Sopenharmony_ciLPSC_CLKDEV1(spi0_clkdev,	NULL,	"spi_davinci.0");
1962306a36Sopenharmony_ciLPSC_CLKDEV1(mmcsd_clkdev,	NULL,	"da830-mmc.0");
2062306a36Sopenharmony_ciLPSC_CLKDEV1(uart0_clkdev,	NULL,	"serial8250.0");
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_cistatic const struct davinci_lpsc_clk_info da830_psc0_info[] = {
2362306a36Sopenharmony_ci	LPSC(0,  0, tpcc,     pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
2462306a36Sopenharmony_ci	LPSC(1,  0, tptc0,    pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
2562306a36Sopenharmony_ci	LPSC(2,  0, tptc1,    pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
2662306a36Sopenharmony_ci	LPSC(3,  0, aemif,    pll0_sysclk3, aemif_clkdev, LPSC_ALWAYS_ENABLED),
2762306a36Sopenharmony_ci	LPSC(4,  0, spi0,     pll0_sysclk2, spi0_clkdev,  0),
2862306a36Sopenharmony_ci	LPSC(5,  0, mmcsd,    pll0_sysclk2, mmcsd_clkdev, 0),
2962306a36Sopenharmony_ci	LPSC(6,  0, aintc,    pll0_sysclk4, NULL,         LPSC_ALWAYS_ENABLED),
3062306a36Sopenharmony_ci	LPSC(7,  0, arm_rom,  pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
3162306a36Sopenharmony_ci	LPSC(8,  0, secu_mgr, pll0_sysclk4, NULL,         LPSC_ALWAYS_ENABLED),
3262306a36Sopenharmony_ci	LPSC(9,  0, uart0,    pll0_sysclk2, uart0_clkdev, 0),
3362306a36Sopenharmony_ci	LPSC(10, 0, scr0_ss,  pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
3462306a36Sopenharmony_ci	LPSC(11, 0, scr1_ss,  pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
3562306a36Sopenharmony_ci	LPSC(12, 0, scr2_ss,  pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
3662306a36Sopenharmony_ci	LPSC(13, 0, pruss,    pll0_sysclk2, NULL,         LPSC_ALWAYS_ENABLED),
3762306a36Sopenharmony_ci	LPSC(14, 0, arm,      pll0_sysclk6, NULL,         LPSC_ALWAYS_ENABLED),
3862306a36Sopenharmony_ci	{ }
3962306a36Sopenharmony_ci};
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_cistatic int da830_psc0_init(struct device *dev, void __iomem *base)
4262306a36Sopenharmony_ci{
4362306a36Sopenharmony_ci	return davinci_psc_register_clocks(dev, da830_psc0_info, 16, base);
4462306a36Sopenharmony_ci}
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic struct clk_bulk_data da830_psc0_parent_clks[] = {
4762306a36Sopenharmony_ci	{ .id = "pll0_sysclk2" },
4862306a36Sopenharmony_ci	{ .id = "pll0_sysclk3" },
4962306a36Sopenharmony_ci	{ .id = "pll0_sysclk4" },
5062306a36Sopenharmony_ci	{ .id = "pll0_sysclk6" },
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ciconst struct davinci_psc_init_data da830_psc0_init_data = {
5462306a36Sopenharmony_ci	.parent_clks		= da830_psc0_parent_clks,
5562306a36Sopenharmony_ci	.num_parent_clks	= ARRAY_SIZE(da830_psc0_parent_clks),
5662306a36Sopenharmony_ci	.psc_init		= &da830_psc0_init,
5762306a36Sopenharmony_ci};
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ciLPSC_CLKDEV3(usb0_clkdev,	"fck",	"da830-usb-phy-clks",
6062306a36Sopenharmony_ci				NULL,	"musb-da8xx",
6162306a36Sopenharmony_ci				NULL,	"cppi41-dmaengine");
6262306a36Sopenharmony_ciLPSC_CLKDEV1(usb1_clkdev,	NULL,	"ohci-da8xx");
6362306a36Sopenharmony_ci/* REVISIT: gpio-davinci.c should be modified to drop con_id */
6462306a36Sopenharmony_ciLPSC_CLKDEV1(gpio_clkdev,	"gpio",	NULL);
6562306a36Sopenharmony_ciLPSC_CLKDEV2(emac_clkdev,	NULL,	"davinci_emac.1",
6662306a36Sopenharmony_ci				"fck",	"davinci_mdio.0");
6762306a36Sopenharmony_ciLPSC_CLKDEV1(mcasp0_clkdev,	NULL,	"davinci-mcasp.0");
6862306a36Sopenharmony_ciLPSC_CLKDEV1(mcasp1_clkdev,	NULL,	"davinci-mcasp.1");
6962306a36Sopenharmony_ciLPSC_CLKDEV1(mcasp2_clkdev,	NULL,	"davinci-mcasp.2");
7062306a36Sopenharmony_ciLPSC_CLKDEV1(spi1_clkdev,	NULL,	"spi_davinci.1");
7162306a36Sopenharmony_ciLPSC_CLKDEV1(i2c1_clkdev,	NULL,	"i2c_davinci.2");
7262306a36Sopenharmony_ciLPSC_CLKDEV1(uart1_clkdev,	NULL,	"serial8250.1");
7362306a36Sopenharmony_ciLPSC_CLKDEV1(uart2_clkdev,	NULL,	"serial8250.2");
7462306a36Sopenharmony_ciLPSC_CLKDEV1(lcdc_clkdev,	"fck",	"da8xx_lcdc.0");
7562306a36Sopenharmony_ciLPSC_CLKDEV2(pwm_clkdev,	"fck",	"ehrpwm.0",
7662306a36Sopenharmony_ci				"fck",	"ehrpwm.1");
7762306a36Sopenharmony_ciLPSC_CLKDEV3(ecap_clkdev,	"fck",	"ecap.0",
7862306a36Sopenharmony_ci				"fck",	"ecap.1",
7962306a36Sopenharmony_ci				"fck",	"ecap.2");
8062306a36Sopenharmony_ciLPSC_CLKDEV2(eqep_clkdev,	NULL,	"eqep.0",
8162306a36Sopenharmony_ci				NULL,	"eqep.1");
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_cistatic const struct davinci_lpsc_clk_info da830_psc1_info[] = {
8462306a36Sopenharmony_ci	LPSC(1,  0, usb0,   pll0_sysclk2, usb0_clkdev,   0),
8562306a36Sopenharmony_ci	LPSC(2,  0, usb1,   pll0_sysclk4, usb1_clkdev,   0),
8662306a36Sopenharmony_ci	LPSC(3,  0, gpio,   pll0_sysclk4, gpio_clkdev,   0),
8762306a36Sopenharmony_ci	LPSC(5,  0, emac,   pll0_sysclk4, emac_clkdev,   0),
8862306a36Sopenharmony_ci	LPSC(6,  0, emif3,  pll0_sysclk5, NULL,          LPSC_ALWAYS_ENABLED),
8962306a36Sopenharmony_ci	LPSC(7,  0, mcasp0, pll0_sysclk2, mcasp0_clkdev, 0),
9062306a36Sopenharmony_ci	LPSC(8,  0, mcasp1, pll0_sysclk2, mcasp1_clkdev, 0),
9162306a36Sopenharmony_ci	LPSC(9,  0, mcasp2, pll0_sysclk2, mcasp2_clkdev, 0),
9262306a36Sopenharmony_ci	LPSC(10, 0, spi1,   pll0_sysclk2, spi1_clkdev,   0),
9362306a36Sopenharmony_ci	LPSC(11, 0, i2c1,   pll0_sysclk4, i2c1_clkdev,   0),
9462306a36Sopenharmony_ci	LPSC(12, 0, uart1,  pll0_sysclk2, uart1_clkdev,  0),
9562306a36Sopenharmony_ci	LPSC(13, 0, uart2,  pll0_sysclk2, uart2_clkdev,  0),
9662306a36Sopenharmony_ci	LPSC(16, 0, lcdc,   pll0_sysclk2, lcdc_clkdev,   0),
9762306a36Sopenharmony_ci	LPSC(17, 0, pwm,    pll0_sysclk2, pwm_clkdev,    0),
9862306a36Sopenharmony_ci	LPSC(20, 0, ecap,   pll0_sysclk2, ecap_clkdev,   0),
9962306a36Sopenharmony_ci	LPSC(21, 0, eqep,   pll0_sysclk2, eqep_clkdev,   0),
10062306a36Sopenharmony_ci	{ }
10162306a36Sopenharmony_ci};
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_cistatic int da830_psc1_init(struct device *dev, void __iomem *base)
10462306a36Sopenharmony_ci{
10562306a36Sopenharmony_ci	return davinci_psc_register_clocks(dev, da830_psc1_info, 32, base);
10662306a36Sopenharmony_ci}
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_cistatic struct clk_bulk_data da830_psc1_parent_clks[] = {
10962306a36Sopenharmony_ci	{ .id = "pll0_sysclk2" },
11062306a36Sopenharmony_ci	{ .id = "pll0_sysclk4" },
11162306a36Sopenharmony_ci	{ .id = "pll0_sysclk5" },
11262306a36Sopenharmony_ci};
11362306a36Sopenharmony_ci
11462306a36Sopenharmony_ciconst struct davinci_psc_init_data da830_psc1_init_data = {
11562306a36Sopenharmony_ci	.parent_clks		= da830_psc1_parent_clks,
11662306a36Sopenharmony_ci	.num_parent_clks	= ARRAY_SIZE(da830_psc1_parent_clks),
11762306a36Sopenharmony_ci	.psc_init		= &da830_psc1_init,
11862306a36Sopenharmony_ci};
119