|  | // SPDX-License-Identifier: GPL-2.0 | 
|  | /* | 
|  | * PSC clock descriptions for TI DaVinci DM646x | 
|  | * | 
|  | * Copyright (C) 2018 David Lechner <david@lechnology.com> | 
|  | */ | 
|  |  | 
|  | #include <linux/clk-provider.h> | 
|  | #include <linux/clk/davinci.h> | 
|  | #include <linux/clk.h> | 
|  | #include <linux/clkdev.h> | 
|  | #include <linux/init.h> | 
|  | #include <linux/kernel.h> | 
|  | #include <linux/types.h> | 
|  |  | 
|  | #include "psc.h" | 
|  |  | 
|  | LPSC_CLKDEV1(ide_clkdev,	NULL,		"palm_bk3710"); | 
|  | LPSC_CLKDEV2(emac_clkdev,	NULL,		"davinci_emac.1", | 
|  | "fck",		"davinci_mdio.0"); | 
|  | LPSC_CLKDEV2(aemif_clkdev,	"aemif",	NULL, | 
|  | NULL,		"ti-aemif"); | 
|  | LPSC_CLKDEV1(mcasp0_clkdev,	NULL,		"davinci-mcasp.0"); | 
|  | LPSC_CLKDEV1(mcasp1_clkdev,	NULL,		"davinci-mcasp.1"); | 
|  | LPSC_CLKDEV1(uart0_clkdev,	NULL,		"serial8250.0"); | 
|  | LPSC_CLKDEV1(uart1_clkdev,	NULL,		"serial8250.1"); | 
|  | LPSC_CLKDEV1(uart2_clkdev,	NULL,		"serial8250.2"); | 
|  | LPSC_CLKDEV1(i2c_clkdev,	NULL,		"i2c_davinci.1"); | 
|  | /* REVISIT: gpio-davinci.c should be modified to drop con_id */ | 
|  | LPSC_CLKDEV1(gpio_clkdev,	"gpio",		NULL); | 
|  | LPSC_CLKDEV1(timer0_clkdev,	"timer0",	 NULL); | 
|  |  | 
|  | static const struct davinci_lpsc_clk_info dm646x_psc_info[] = { | 
|  | LPSC(0,  0, arm,      pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | /* REVISIT how to disable? */ | 
|  | LPSC(1,  0, dsp,      pll1_sysclk1, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(4,  0, edma_cc,  pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(5,  0, edma_tc0, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(6,  0, edma_tc1, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(7,  0, edma_tc2, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(8,  0, edma_tc3, pll1_sysclk2, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(10, 0, ide,      pll1_sysclk4, ide_clkdev,    0), | 
|  | LPSC(14, 0, emac,     pll1_sysclk3, emac_clkdev,   0), | 
|  | LPSC(16, 0, vpif0,    ref_clk,      NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(17, 0, vpif1,    ref_clk,      NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(21, 0, aemif,    pll1_sysclk3, aemif_clkdev,  LPSC_ALWAYS_ENABLED), | 
|  | LPSC(22, 0, mcasp0,   pll1_sysclk3, mcasp0_clkdev, 0), | 
|  | LPSC(23, 0, mcasp1,   pll1_sysclk3, mcasp1_clkdev, 0), | 
|  | LPSC(26, 0, uart0,    aux_clkin,    uart0_clkdev,  0), | 
|  | LPSC(27, 0, uart1,    aux_clkin,    uart1_clkdev,  0), | 
|  | LPSC(28, 0, uart2,    aux_clkin,    uart2_clkdev,  0), | 
|  | /* REVIST: disabling hangs system */ | 
|  | LPSC(29, 0, pwm0,     pll1_sysclk3, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | /* REVIST: disabling hangs system */ | 
|  | LPSC(30, 0, pwm1,     pll1_sysclk3, NULL,          LPSC_ALWAYS_ENABLED), | 
|  | LPSC(31, 0, i2c,      pll1_sysclk3, i2c_clkdev,    0), | 
|  | LPSC(33, 0, gpio,     pll1_sysclk3, gpio_clkdev,   0), | 
|  | LPSC(34, 0, timer0,   pll1_sysclk3, timer0_clkdev, LPSC_ALWAYS_ENABLED), | 
|  | LPSC(35, 0, timer1,   pll1_sysclk3, NULL,          0), | 
|  | { } | 
|  | }; | 
|  |  | 
|  | int dm646x_psc_init(struct device *dev, void __iomem *base) | 
|  | { | 
|  | return davinci_psc_register_clocks(dev, dm646x_psc_info, 46, base); | 
|  | } | 
|  |  | 
|  | static struct clk_bulk_data dm646x_psc_parent_clks[] = { | 
|  | { .id = "ref_clk"      }, | 
|  | { .id = "aux_clkin"    }, | 
|  | { .id = "pll1_sysclk1" }, | 
|  | { .id = "pll1_sysclk2" }, | 
|  | { .id = "pll1_sysclk3" }, | 
|  | { .id = "pll1_sysclk4" }, | 
|  | { .id = "pll1_sysclk5" }, | 
|  | }; | 
|  |  | 
|  | const struct davinci_psc_init_data dm646x_psc_init_data = { | 
|  | .parent_clks		= dm646x_psc_parent_clks, | 
|  | .num_parent_clks	= ARRAY_SIZE(dm646x_psc_parent_clks), | 
|  | .psc_init		= &dm646x_psc_init, | 
|  | }; |