am335x_prcm.c (281085) | am335x_prcm.c (283276) |
---|---|
1/*- 2 * Copyright (c) 2012 Damjan Marion <dmarion@Freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> | 1/*- 2 * Copyright (c) 2012 Damjan Marion <dmarion@Freebsd.org> 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 11 unchanged lines hidden (view full) --- 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 */ 26 27#include <sys/cdefs.h> |
28__FBSDID("$FreeBSD: head/sys/arm/ti/am335x/am335x_prcm.c 281085 2015-04-04 21:34:26Z andrew $"); | 28__FBSDID("$FreeBSD: head/sys/arm/ti/am335x/am335x_prcm.c 283276 2015-05-22 03:16:18Z gonzo $"); |
29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/bus.h> 33#include <sys/kernel.h> 34#include <sys/module.h> 35#include <sys/malloc.h> 36#include <sys/rman.h> --- 195 unchanged lines hidden (view full) --- 232 { .id = LCDC_CLK, 233 .clk_activate = am335x_clk_lcdc_activate, 234 .clk_deactivate = NULL, 235 .clk_set_source = NULL, 236 .clk_accessible = NULL, 237 .clk_get_source_freq = am335x_clk_get_arm_disp_freq, 238 }, 239 | 29 30#include <sys/param.h> 31#include <sys/systm.h> 32#include <sys/bus.h> 33#include <sys/kernel.h> 34#include <sys/module.h> 35#include <sys/malloc.h> 36#include <sys/rman.h> --- 195 unchanged lines hidden (view full) --- 232 { .id = LCDC_CLK, 233 .clk_activate = am335x_clk_lcdc_activate, 234 .clk_deactivate = NULL, 235 .clk_set_source = NULL, 236 .clk_accessible = NULL, 237 .clk_get_source_freq = am335x_clk_get_arm_disp_freq, 238 }, 239 |
240 /* UART. Uart0 clock cannot be controlled. */ 241 AM335X_NOOP_CLOCK_DEV(UART0_CLK), 242 AM335X_GENERIC_CLOCK_DEV(UART1_CLK), | 240 /* UART */ 241 AM335X_NOOP_CLOCK_DEV(UART1_CLK), |
243 AM335X_GENERIC_CLOCK_DEV(UART2_CLK), 244 AM335X_GENERIC_CLOCK_DEV(UART3_CLK), 245 AM335X_GENERIC_CLOCK_DEV(UART4_CLK), 246 AM335X_GENERIC_CLOCK_DEV(UART5_CLK), | 242 AM335X_GENERIC_CLOCK_DEV(UART2_CLK), 243 AM335X_GENERIC_CLOCK_DEV(UART3_CLK), 244 AM335X_GENERIC_CLOCK_DEV(UART4_CLK), 245 AM335X_GENERIC_CLOCK_DEV(UART5_CLK), |
246 AM335X_GENERIC_CLOCK_DEV(UART6_CLK), |
|
247 248 /* DMTimer */ | 247 248 /* DMTimer */ |
249 AM335X_GENERIC_CLOCK_DEV(DMTIMER2_CLK), 250 AM335X_GENERIC_CLOCK_DEV(DMTIMER3_CLK), 251 AM335X_GENERIC_CLOCK_DEV(DMTIMER4_CLK), 252 AM335X_GENERIC_CLOCK_DEV(DMTIMER5_CLK), 253 AM335X_GENERIC_CLOCK_DEV(DMTIMER6_CLK), 254 AM335X_GENERIC_CLOCK_DEV(DMTIMER7_CLK), | 249 AM335X_GENERIC_CLOCK_DEV(TIMER2_CLK), 250 AM335X_GENERIC_CLOCK_DEV(TIMER3_CLK), 251 AM335X_GENERIC_CLOCK_DEV(TIMER4_CLK), 252 AM335X_GENERIC_CLOCK_DEV(TIMER5_CLK), 253 AM335X_GENERIC_CLOCK_DEV(TIMER6_CLK), 254 AM335X_GENERIC_CLOCK_DEV(TIMER7_CLK), |
255 | 255 |
256 /* GPIO */ 257 AM335X_GPIO_CLOCK_DEV(GPIO0_CLK), | 256 /* GPIO, we use hwmods as reference, not units in spec */ |
258 AM335X_GPIO_CLOCK_DEV(GPIO1_CLK), 259 AM335X_GPIO_CLOCK_DEV(GPIO2_CLK), 260 AM335X_GPIO_CLOCK_DEV(GPIO3_CLK), | 257 AM335X_GPIO_CLOCK_DEV(GPIO1_CLK), 258 AM335X_GPIO_CLOCK_DEV(GPIO2_CLK), 259 AM335X_GPIO_CLOCK_DEV(GPIO3_CLK), |
260 AM335X_GPIO_CLOCK_DEV(GPIO4_CLK), |
|
261 | 261 |
262 /* I2C */ 263 AM335X_GENERIC_CLOCK_DEV(I2C0_CLK), | 262 /* I2C we use hwmods as reference, not units in spec */ |
264 AM335X_GENERIC_CLOCK_DEV(I2C1_CLK), 265 AM335X_GENERIC_CLOCK_DEV(I2C2_CLK), | 263 AM335X_GENERIC_CLOCK_DEV(I2C1_CLK), 264 AM335X_GENERIC_CLOCK_DEV(I2C2_CLK), |
265 AM335X_GENERIC_CLOCK_DEV(I2C3_CLK), |
|
266 267 /* TSC_ADC */ 268 AM335X_GENERIC_CLOCK_DEV(TSC_ADC_CLK), 269 270 /* EDMA */ 271 AM335X_GENERIC_CLOCK_DEV(EDMA_TPCC_CLK), 272 AM335X_GENERIC_CLOCK_DEV(EDMA_TPTC0_CLK), 273 AM335X_GENERIC_CLOCK_DEV(EDMA_TPTC1_CLK), 274 AM335X_GENERIC_CLOCK_DEV(EDMA_TPTC2_CLK), 275 276 /* MMCHS */ | 266 267 /* TSC_ADC */ 268 AM335X_GENERIC_CLOCK_DEV(TSC_ADC_CLK), 269 270 /* EDMA */ 271 AM335X_GENERIC_CLOCK_DEV(EDMA_TPCC_CLK), 272 AM335X_GENERIC_CLOCK_DEV(EDMA_TPTC0_CLK), 273 AM335X_GENERIC_CLOCK_DEV(EDMA_TPTC1_CLK), 274 AM335X_GENERIC_CLOCK_DEV(EDMA_TPTC2_CLK), 275 276 /* MMCHS */ |
277 AM335X_MMCHS_CLOCK_DEV(MMC0_CLK), | |
278 AM335X_MMCHS_CLOCK_DEV(MMC1_CLK), 279 AM335X_MMCHS_CLOCK_DEV(MMC2_CLK), | 277 AM335X_MMCHS_CLOCK_DEV(MMC1_CLK), 278 AM335X_MMCHS_CLOCK_DEV(MMC2_CLK), |
279 AM335X_MMCHS_CLOCK_DEV(MMC3_CLK), |
|
280 281 /* PWMSS */ 282 AM335X_GENERIC_CLOCK_DEV(PWMSS0_CLK), 283 AM335X_GENERIC_CLOCK_DEV(PWMSS1_CLK), 284 AM335X_GENERIC_CLOCK_DEV(PWMSS2_CLK), 285 286 /* System Mailbox clock */ 287 AM335X_GENERIC_CLOCK_DEV(MAILBOX0_CLK), --- 26 unchanged lines hidden (view full) --- 314 { .id = (i), \ 315 .clkctrl_reg = (c), \ 316 .clksel_reg = (s), \ 317 } 318 319static struct am335x_clk_details g_am335x_clk_details[] = { 320 321 /* UART. UART0 clock not controllable. */ | 280 281 /* PWMSS */ 282 AM335X_GENERIC_CLOCK_DEV(PWMSS0_CLK), 283 AM335X_GENERIC_CLOCK_DEV(PWMSS1_CLK), 284 AM335X_GENERIC_CLOCK_DEV(PWMSS2_CLK), 285 286 /* System Mailbox clock */ 287 AM335X_GENERIC_CLOCK_DEV(MAILBOX0_CLK), --- 26 unchanged lines hidden (view full) --- 314 { .id = (i), \ 315 .clkctrl_reg = (c), \ 316 .clksel_reg = (s), \ 317 } 318 319static struct am335x_clk_details g_am335x_clk_details[] = { 320 321 /* UART. UART0 clock not controllable. */ |
322 _CLK_DETAIL(UART0_CLK, 0, 0), 323 _CLK_DETAIL(UART1_CLK, CM_PER_UART1_CLKCTRL, 0), 324 _CLK_DETAIL(UART2_CLK, CM_PER_UART2_CLKCTRL, 0), 325 _CLK_DETAIL(UART3_CLK, CM_PER_UART3_CLKCTRL, 0), 326 _CLK_DETAIL(UART4_CLK, CM_PER_UART4_CLKCTRL, 0), 327 _CLK_DETAIL(UART5_CLK, CM_PER_UART5_CLKCTRL, 0), | 322 _CLK_DETAIL(UART1_CLK, 0, 0), 323 _CLK_DETAIL(UART2_CLK, CM_PER_UART1_CLKCTRL, 0), 324 _CLK_DETAIL(UART3_CLK, CM_PER_UART2_CLKCTRL, 0), 325 _CLK_DETAIL(UART4_CLK, CM_PER_UART3_CLKCTRL, 0), 326 _CLK_DETAIL(UART5_CLK, CM_PER_UART4_CLKCTRL, 0), 327 _CLK_DETAIL(UART6_CLK, CM_PER_UART5_CLKCTRL, 0), |
328 329 /* DMTimer modules */ | 328 329 /* DMTimer modules */ |
330 _CLK_DETAIL(DMTIMER2_CLK, CM_PER_TIMER2_CLKCTRL, CLKSEL_TIMER2_CLK), 331 _CLK_DETAIL(DMTIMER3_CLK, CM_PER_TIMER3_CLKCTRL, CLKSEL_TIMER3_CLK), 332 _CLK_DETAIL(DMTIMER4_CLK, CM_PER_TIMER4_CLKCTRL, CLKSEL_TIMER4_CLK), 333 _CLK_DETAIL(DMTIMER5_CLK, CM_PER_TIMER5_CLKCTRL, CLKSEL_TIMER5_CLK), 334 _CLK_DETAIL(DMTIMER6_CLK, CM_PER_TIMER6_CLKCTRL, CLKSEL_TIMER6_CLK), 335 _CLK_DETAIL(DMTIMER7_CLK, CM_PER_TIMER7_CLKCTRL, CLKSEL_TIMER7_CLK), | 330 _CLK_DETAIL(TIMER2_CLK, CM_PER_TIMER2_CLKCTRL, CLKSEL_TIMER2_CLK), 331 _CLK_DETAIL(TIMER3_CLK, CM_PER_TIMER3_CLKCTRL, CLKSEL_TIMER3_CLK), 332 _CLK_DETAIL(TIMER4_CLK, CM_PER_TIMER4_CLKCTRL, CLKSEL_TIMER4_CLK), 333 _CLK_DETAIL(TIMER5_CLK, CM_PER_TIMER5_CLKCTRL, CLKSEL_TIMER5_CLK), 334 _CLK_DETAIL(TIMER6_CLK, CM_PER_TIMER6_CLKCTRL, CLKSEL_TIMER6_CLK), 335 _CLK_DETAIL(TIMER7_CLK, CM_PER_TIMER7_CLKCTRL, CLKSEL_TIMER7_CLK), |
336 | 336 |
337 /* GPIO modules */ 338 _CLK_DETAIL(GPIO0_CLK, CM_WKUP_GPIO0_CLKCTRL, 0), 339 _CLK_DETAIL(GPIO1_CLK, CM_PER_GPIO1_CLKCTRL, 0), 340 _CLK_DETAIL(GPIO2_CLK, CM_PER_GPIO2_CLKCTRL, 0), 341 _CLK_DETAIL(GPIO3_CLK, CM_PER_GPIO3_CLKCTRL, 0), | 337 /* GPIO modules, hwmods start with gpio1 */ 338 _CLK_DETAIL(GPIO1_CLK, CM_WKUP_GPIO0_CLKCTRL, 0), 339 _CLK_DETAIL(GPIO2_CLK, CM_PER_GPIO1_CLKCTRL, 0), 340 _CLK_DETAIL(GPIO3_CLK, CM_PER_GPIO2_CLKCTRL, 0), 341 _CLK_DETAIL(GPIO4_CLK, CM_PER_GPIO3_CLKCTRL, 0), |
342 | 342 |
343 /* I2C modules */ 344 _CLK_DETAIL(I2C0_CLK, CM_WKUP_I2C0_CLKCTRL, 0), 345 _CLK_DETAIL(I2C1_CLK, CM_PER_I2C1_CLKCTRL, 0), 346 _CLK_DETAIL(I2C2_CLK, CM_PER_I2C2_CLKCTRL, 0), | 343 /* I2C modules, hwmods start with i2c1 */ 344 _CLK_DETAIL(I2C1_CLK, CM_WKUP_I2C0_CLKCTRL, 0), 345 _CLK_DETAIL(I2C2_CLK, CM_PER_I2C1_CLKCTRL, 0), 346 _CLK_DETAIL(I2C3_CLK, CM_PER_I2C2_CLKCTRL, 0), |
347 348 /* TSC_ADC module */ 349 _CLK_DETAIL(TSC_ADC_CLK, CM_WKUP_ADC_TSC_CLKCTRL, 0), 350 351 /* EDMA modules */ 352 _CLK_DETAIL(EDMA_TPCC_CLK, CM_PER_TPCC_CLKCTRL, 0), 353 _CLK_DETAIL(EDMA_TPTC0_CLK, CM_PER_TPTC0_CLKCTRL, 0), 354 _CLK_DETAIL(EDMA_TPTC1_CLK, CM_PER_TPTC1_CLKCTRL, 0), 355 _CLK_DETAIL(EDMA_TPTC2_CLK, CM_PER_TPTC2_CLKCTRL, 0), 356 | 347 348 /* TSC_ADC module */ 349 _CLK_DETAIL(TSC_ADC_CLK, CM_WKUP_ADC_TSC_CLKCTRL, 0), 350 351 /* EDMA modules */ 352 _CLK_DETAIL(EDMA_TPCC_CLK, CM_PER_TPCC_CLKCTRL, 0), 353 _CLK_DETAIL(EDMA_TPTC0_CLK, CM_PER_TPTC0_CLKCTRL, 0), 354 _CLK_DETAIL(EDMA_TPTC1_CLK, CM_PER_TPTC1_CLKCTRL, 0), 355 _CLK_DETAIL(EDMA_TPTC2_CLK, CM_PER_TPTC2_CLKCTRL, 0), 356 |
357 /* MMCHS modules*/ 358 _CLK_DETAIL(MMC0_CLK, CM_PER_MMC0_CLKCTRL, 0), 359 _CLK_DETAIL(MMC1_CLK, CM_PER_MMC1_CLKCTRL, 0), | 357 /* MMCHS modules, hwmods start with mmc1*/ 358 _CLK_DETAIL(MMC1_CLK, CM_PER_MMC0_CLKCTRL, 0), |
360 _CLK_DETAIL(MMC2_CLK, CM_PER_MMC1_CLKCTRL, 0), | 359 _CLK_DETAIL(MMC2_CLK, CM_PER_MMC1_CLKCTRL, 0), |
360 _CLK_DETAIL(MMC3_CLK, CM_PER_MMC1_CLKCTRL, 0), |
|
361 362 /* PWMSS modules */ 363 _CLK_DETAIL(PWMSS0_CLK, CM_PER_EPWMSS0_CLKCTRL, 0), 364 _CLK_DETAIL(PWMSS1_CLK, CM_PER_EPWMSS1_CLKCTRL, 0), 365 _CLK_DETAIL(PWMSS2_CLK, CM_PER_EPWMSS2_CLKCTRL, 0), 366 367 _CLK_DETAIL(MAILBOX0_CLK, CM_PER_MAILBOX0_CLKCTRL, 0), 368 _CLK_DETAIL(SPINLOCK0_CLK, CM_PER_SPINLOCK0_CLKCTRL, 0), --- 14 unchanged lines hidden (view full) --- 383 384static int 385am335x_prcm_probe(device_t dev) 386{ 387 388 if (!ofw_bus_status_okay(dev)) 389 return (ENXIO); 390 | 361 362 /* PWMSS modules */ 363 _CLK_DETAIL(PWMSS0_CLK, CM_PER_EPWMSS0_CLKCTRL, 0), 364 _CLK_DETAIL(PWMSS1_CLK, CM_PER_EPWMSS1_CLKCTRL, 0), 365 _CLK_DETAIL(PWMSS2_CLK, CM_PER_EPWMSS2_CLKCTRL, 0), 366 367 _CLK_DETAIL(MAILBOX0_CLK, CM_PER_MAILBOX0_CLKCTRL, 0), 368 _CLK_DETAIL(SPINLOCK0_CLK, CM_PER_SPINLOCK0_CLKCTRL, 0), --- 14 unchanged lines hidden (view full) --- 383 384static int 385am335x_prcm_probe(device_t dev) 386{ 387 388 if (!ofw_bus_status_okay(dev)) 389 return (ENXIO); 390 |
391 if (ofw_bus_is_compatible(dev, "am335x,prcm")) { | 391 if (ofw_bus_is_compatible(dev, "ti,am3-prcm")) { |
392 device_set_desc(dev, "AM335x Power and Clock Management"); 393 return(BUS_PROBE_DEFAULT); 394 } 395 396 return (ENXIO); 397} 398 399static int --- 11 unchanged lines hidden (view full) --- 411 } 412 413 sc->bst = rman_get_bustag(sc->res[0]); 414 sc->bsh = rman_get_bushandle(sc->res[0]); 415 416 am335x_prcm_sc = sc; 417 ti_cpu_reset = am335x_prcm_reset; 418 | 392 device_set_desc(dev, "AM335x Power and Clock Management"); 393 return(BUS_PROBE_DEFAULT); 394 } 395 396 return (ENXIO); 397} 398 399static int --- 11 unchanged lines hidden (view full) --- 411 } 412 413 sc->bst = rman_get_bustag(sc->res[0]); 414 sc->bsh = rman_get_bushandle(sc->res[0]); 415 416 am335x_prcm_sc = sc; 417 ti_cpu_reset = am335x_prcm_reset; 418 |
419 am335x_clk_get_sysclk_freq(NULL, &sysclk); 420 am335x_clk_get_arm_fclk_freq(NULL, &fclk); 421 device_printf(dev, "Clocks: System %u.%01u MHz, CPU %u MHz\n", 422 sysclk/1000000, (sysclk % 1000000)/100000, fclk/1000000); | 419 if (am335x_clk_get_sysclk_freq(NULL, &sysclk) != 0) 420 sysclk = 0; 421 if (am335x_clk_get_arm_fclk_freq(NULL, &fclk) != 0) 422 fclk = 0; 423 if (sysclk && fclk) 424 device_printf(dev, "Clocks: System %u.%01u MHz, CPU %u MHz\n", 425 sysclk/1000000, (sysclk % 1000000)/100000, fclk/1000000); 426 else 427 device_printf(dev, "can't read frequencies yet (SCM device not ready?)\n"); |
423 424 return (0); 425} 426 427static device_method_t am335x_prcm_methods[] = { 428 DEVMETHOD(device_probe, am335x_prcm_probe), 429 DEVMETHOD(device_attach, am335x_prcm_attach), 430 { 0, 0 } --- 367 unchanged lines hidden --- | 428 429 return (0); 430} 431 432static device_method_t am335x_prcm_methods[] = { 433 DEVMETHOD(device_probe, am335x_prcm_probe), 434 DEVMETHOD(device_attach, am335x_prcm_attach), 435 { 0, 0 } --- 367 unchanged lines hidden --- |