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

meson: clk: Add support for clock gates

This patch adds support for the meson8b clock gates. Most of
them are disabled by Amlogic U-Boot, but need to be enabled
for ethernet, USB and many other components.

Signed-off-by: Alexander Müller <serveralex@gmail.com>
Signed-off-by: Michael Turquette <mturquette@baylibre.com>
Link: lkml.kernel.org/r/1472319654-59048-7-git-send-email-serveralex@gmail.com

authored by

Alexander Müller and committed by
Michael Turquette
e31a1900 7ba64d82

+254
+249
drivers/clk/meson/meson8b.c
··· 313 313 }, 314 314 }; 315 315 316 + /* Everything Else (EE) domain gates */ 317 + 318 + static MESON_GATE(meson8b_ddr, HHI_GCLK_MPEG0, 0); 319 + static MESON_GATE(meson8b_dos, HHI_GCLK_MPEG0, 1); 320 + static MESON_GATE(meson8b_isa, HHI_GCLK_MPEG0, 5); 321 + static MESON_GATE(meson8b_pl301, HHI_GCLK_MPEG0, 6); 322 + static MESON_GATE(meson8b_periphs, HHI_GCLK_MPEG0, 7); 323 + static MESON_GATE(meson8b_spicc, HHI_GCLK_MPEG0, 8); 324 + static MESON_GATE(meson8b_i2c, HHI_GCLK_MPEG0, 9); 325 + static MESON_GATE(meson8b_sar_adc, HHI_GCLK_MPEG0, 10); 326 + static MESON_GATE(meson8b_smart_card, HHI_GCLK_MPEG0, 11); 327 + static MESON_GATE(meson8b_rng0, HHI_GCLK_MPEG0, 12); 328 + static MESON_GATE(meson8b_uart0, HHI_GCLK_MPEG0, 13); 329 + static MESON_GATE(meson8b_sdhc, HHI_GCLK_MPEG0, 14); 330 + static MESON_GATE(meson8b_stream, HHI_GCLK_MPEG0, 15); 331 + static MESON_GATE(meson8b_async_fifo, HHI_GCLK_MPEG0, 16); 332 + static MESON_GATE(meson8b_sdio, HHI_GCLK_MPEG0, 17); 333 + static MESON_GATE(meson8b_abuf, HHI_GCLK_MPEG0, 18); 334 + static MESON_GATE(meson8b_hiu_iface, HHI_GCLK_MPEG0, 19); 335 + static MESON_GATE(meson8b_assist_misc, HHI_GCLK_MPEG0, 23); 336 + static MESON_GATE(meson8b_spi, HHI_GCLK_MPEG0, 30); 337 + 338 + static MESON_GATE(meson8b_i2s_spdif, HHI_GCLK_MPEG1, 2); 339 + static MESON_GATE(meson8b_eth, HHI_GCLK_MPEG1, 3); 340 + static MESON_GATE(meson8b_demux, HHI_GCLK_MPEG1, 4); 341 + static MESON_GATE(meson8b_aiu_glue, HHI_GCLK_MPEG1, 6); 342 + static MESON_GATE(meson8b_iec958, HHI_GCLK_MPEG1, 7); 343 + static MESON_GATE(meson8b_i2s_out, HHI_GCLK_MPEG1, 8); 344 + static MESON_GATE(meson8b_amclk, HHI_GCLK_MPEG1, 9); 345 + static MESON_GATE(meson8b_aififo2, HHI_GCLK_MPEG1, 10); 346 + static MESON_GATE(meson8b_mixer, HHI_GCLK_MPEG1, 11); 347 + static MESON_GATE(meson8b_mixer_iface, HHI_GCLK_MPEG1, 12); 348 + static MESON_GATE(meson8b_adc, HHI_GCLK_MPEG1, 13); 349 + static MESON_GATE(meson8b_blkmv, HHI_GCLK_MPEG1, 14); 350 + static MESON_GATE(meson8b_aiu, HHI_GCLK_MPEG1, 15); 351 + static MESON_GATE(meson8b_uart1, HHI_GCLK_MPEG1, 16); 352 + static MESON_GATE(meson8b_g2d, HHI_GCLK_MPEG1, 20); 353 + static MESON_GATE(meson8b_usb0, HHI_GCLK_MPEG1, 21); 354 + static MESON_GATE(meson8b_usb1, HHI_GCLK_MPEG1, 22); 355 + static MESON_GATE(meson8b_reset, HHI_GCLK_MPEG1, 23); 356 + static MESON_GATE(meson8b_nand, HHI_GCLK_MPEG1, 24); 357 + static MESON_GATE(meson8b_dos_parser, HHI_GCLK_MPEG1, 25); 358 + static MESON_GATE(meson8b_usb, HHI_GCLK_MPEG1, 26); 359 + static MESON_GATE(meson8b_vdin1, HHI_GCLK_MPEG1, 28); 360 + static MESON_GATE(meson8b_ahb_arb0, HHI_GCLK_MPEG1, 29); 361 + static MESON_GATE(meson8b_efuse, HHI_GCLK_MPEG1, 30); 362 + static MESON_GATE(meson8b_boot_rom, HHI_GCLK_MPEG1, 31); 363 + 364 + static MESON_GATE(meson8b_ahb_data_bus, HHI_GCLK_MPEG2, 1); 365 + static MESON_GATE(meson8b_ahb_ctrl_bus, HHI_GCLK_MPEG2, 2); 366 + static MESON_GATE(meson8b_hdmi_intr_sync, HHI_GCLK_MPEG2, 3); 367 + static MESON_GATE(meson8b_hdmi_pclk, HHI_GCLK_MPEG2, 4); 368 + static MESON_GATE(meson8b_usb1_ddr_bridge, HHI_GCLK_MPEG2, 8); 369 + static MESON_GATE(meson8b_usb0_ddr_bridge, HHI_GCLK_MPEG2, 9); 370 + static MESON_GATE(meson8b_mmc_pclk, HHI_GCLK_MPEG2, 11); 371 + static MESON_GATE(meson8b_dvin, HHI_GCLK_MPEG2, 12); 372 + static MESON_GATE(meson8b_uart2, HHI_GCLK_MPEG2, 15); 373 + static MESON_GATE(meson8b_sana, HHI_GCLK_MPEG2, 22); 374 + static MESON_GATE(meson8b_vpu_intr, HHI_GCLK_MPEG2, 25); 375 + static MESON_GATE(meson8b_sec_ahb_ahb3_bridge, HHI_GCLK_MPEG2, 26); 376 + static MESON_GATE(meson8b_clk81_a9, HHI_GCLK_MPEG2, 29); 377 + 378 + static MESON_GATE(meson8b_vclk2_venci0, HHI_GCLK_OTHER, 1); 379 + static MESON_GATE(meson8b_vclk2_venci1, HHI_GCLK_OTHER, 2); 380 + static MESON_GATE(meson8b_vclk2_vencp0, HHI_GCLK_OTHER, 3); 381 + static MESON_GATE(meson8b_vclk2_vencp1, HHI_GCLK_OTHER, 4); 382 + static MESON_GATE(meson8b_gclk_venci_int, HHI_GCLK_OTHER, 8); 383 + static MESON_GATE(meson8b_gclk_vencp_int, HHI_GCLK_OTHER, 9); 384 + static MESON_GATE(meson8b_dac_clk, HHI_GCLK_OTHER, 10); 385 + static MESON_GATE(meson8b_aoclk_gate, HHI_GCLK_OTHER, 14); 386 + static MESON_GATE(meson8b_iec958_gate, HHI_GCLK_OTHER, 16); 387 + static MESON_GATE(meson8b_enc480p, HHI_GCLK_OTHER, 20); 388 + static MESON_GATE(meson8b_rng1, HHI_GCLK_OTHER, 21); 389 + static MESON_GATE(meson8b_gclk_vencl_int, HHI_GCLK_OTHER, 22); 390 + static MESON_GATE(meson8b_vclk2_venclmcc, HHI_GCLK_OTHER, 24); 391 + static MESON_GATE(meson8b_vclk2_vencl, HHI_GCLK_OTHER, 25); 392 + static MESON_GATE(meson8b_vclk2_other, HHI_GCLK_OTHER, 26); 393 + static MESON_GATE(meson8b_edp, HHI_GCLK_OTHER, 31); 394 + 395 + /* Always On (AO) domain gates */ 396 + 397 + static MESON_GATE(meson8b_ao_media_cpu, HHI_GCLK_AO, 0); 398 + static MESON_GATE(meson8b_ao_ahb_sram, HHI_GCLK_AO, 1); 399 + static MESON_GATE(meson8b_ao_ahb_bus, HHI_GCLK_AO, 2); 400 + static MESON_GATE(meson8b_ao_iface, HHI_GCLK_AO, 3); 401 + 316 402 static struct clk_hw_onecell_data meson8b_hw_onecell_data = { 317 403 .hws = { 318 404 [CLKID_XTAL] = &meson8b_xtal.hw, ··· 414 328 [CLKID_MPEG_SEL] = &meson8b_mpeg_clk_sel.hw, 415 329 [CLKID_MPEG_DIV] = &meson8b_mpeg_clk_div.hw, 416 330 [CLKID_CLK81] = &meson8b_clk81.hw, 331 + [CLKID_DDR] = &meson8b_ddr.hw, 332 + [CLKID_DOS] = &meson8b_dos.hw, 333 + [CLKID_ISA] = &meson8b_isa.hw, 334 + [CLKID_PL301] = &meson8b_pl301.hw, 335 + [CLKID_PERIPHS] = &meson8b_periphs.hw, 336 + [CLKID_SPICC] = &meson8b_spicc.hw, 337 + [CLKID_I2C] = &meson8b_i2c.hw, 338 + [CLKID_SAR_ADC] = &meson8b_sar_adc.hw, 339 + [CLKID_SMART_CARD] = &meson8b_smart_card.hw, 340 + [CLKID_RNG0] = &meson8b_rng0.hw, 341 + [CLKID_UART0] = &meson8b_uart0.hw, 342 + [CLKID_SDHC] = &meson8b_sdhc.hw, 343 + [CLKID_STREAM] = &meson8b_stream.hw, 344 + [CLKID_ASYNC_FIFO] = &meson8b_async_fifo.hw, 345 + [CLKID_SDIO] = &meson8b_sdio.hw, 346 + [CLKID_ABUF] = &meson8b_abuf.hw, 347 + [CLKID_HIU_IFACE] = &meson8b_hiu_iface.hw, 348 + [CLKID_ASSIST_MISC] = &meson8b_assist_misc.hw, 349 + [CLKID_SPI] = &meson8b_spi.hw, 350 + [CLKID_I2S_SPDIF] = &meson8b_i2s_spdif.hw, 351 + [CLKID_ETH] = &meson8b_eth.hw, 352 + [CLKID_DEMUX] = &meson8b_demux.hw, 353 + [CLKID_AIU_GLUE] = &meson8b_aiu_glue.hw, 354 + [CLKID_IEC958] = &meson8b_iec958.hw, 355 + [CLKID_I2S_OUT] = &meson8b_i2s_out.hw, 356 + [CLKID_AMCLK] = &meson8b_amclk.hw, 357 + [CLKID_AIFIFO2] = &meson8b_aififo2.hw, 358 + [CLKID_MIXER] = &meson8b_mixer.hw, 359 + [CLKID_MIXER_IFACE] = &meson8b_mixer_iface.hw, 360 + [CLKID_ADC] = &meson8b_adc.hw, 361 + [CLKID_BLKMV] = &meson8b_blkmv.hw, 362 + [CLKID_AIU] = &meson8b_aiu.hw, 363 + [CLKID_UART1] = &meson8b_uart1.hw, 364 + [CLKID_G2D] = &meson8b_g2d.hw, 365 + [CLKID_USB0] = &meson8b_usb0.hw, 366 + [CLKID_USB1] = &meson8b_usb1.hw, 367 + [CLKID_RESET] = &meson8b_reset.hw, 368 + [CLKID_NAND] = &meson8b_nand.hw, 369 + [CLKID_DOS_PARSER] = &meson8b_dos_parser.hw, 370 + [CLKID_USB] = &meson8b_usb.hw, 371 + [CLKID_VDIN1] = &meson8b_vdin1.hw, 372 + [CLKID_AHB_ARB0] = &meson8b_ahb_arb0.hw, 373 + [CLKID_EFUSE] = &meson8b_efuse.hw, 374 + [CLKID_BOOT_ROM] = &meson8b_boot_rom.hw, 375 + [CLKID_AHB_DATA_BUS] = &meson8b_ahb_data_bus.hw, 376 + [CLKID_AHB_CTRL_BUS] = &meson8b_ahb_ctrl_bus.hw, 377 + [CLKID_HDMI_INTR_SYNC] = &meson8b_hdmi_intr_sync.hw, 378 + [CLKID_HDMI_PCLK] = &meson8b_hdmi_pclk.hw, 379 + [CLKID_USB1_DDR_BRIDGE] = &meson8b_usb1_ddr_bridge.hw, 380 + [CLKID_USB0_DDR_BRIDGE] = &meson8b_usb0_ddr_bridge.hw, 381 + [CLKID_MMC_PCLK] = &meson8b_mmc_pclk.hw, 382 + [CLKID_DVIN] = &meson8b_dvin.hw, 383 + [CLKID_UART2] = &meson8b_uart2.hw, 384 + [CLKID_SANA] = &meson8b_sana.hw, 385 + [CLKID_VPU_INTR] = &meson8b_vpu_intr.hw, 386 + [CLKID_SEC_AHB_AHB3_BRIDGE] = &meson8b_sec_ahb_ahb3_bridge.hw, 387 + [CLKID_CLK81_A9] = &meson8b_clk81_a9.hw, 388 + [CLKID_VCLK2_VENCI0] = &meson8b_vclk2_venci0.hw, 389 + [CLKID_VCLK2_VENCI1] = &meson8b_vclk2_venci1.hw, 390 + [CLKID_VCLK2_VENCP0] = &meson8b_vclk2_vencp0.hw, 391 + [CLKID_VCLK2_VENCP1] = &meson8b_vclk2_vencp1.hw, 392 + [CLKID_GCLK_VENCI_INT] = &meson8b_gclk_venci_int.hw, 393 + [CLKID_GCLK_VENCI_INT] = &meson8b_gclk_vencp_int.hw, 394 + [CLKID_DAC_CLK] = &meson8b_dac_clk.hw, 395 + [CLKID_AOCLK_GATE] = &meson8b_aoclk_gate.hw, 396 + [CLKID_IEC958_GATE] = &meson8b_iec958_gate.hw, 397 + [CLKID_ENC480P] = &meson8b_enc480p.hw, 398 + [CLKID_RNG1] = &meson8b_rng1.hw, 399 + [CLKID_GCLK_VENCL_INT] = &meson8b_gclk_vencl_int.hw, 400 + [CLKID_VCLK2_VENCLMCC] = &meson8b_vclk2_venclmcc.hw, 401 + [CLKID_VCLK2_VENCL] = &meson8b_vclk2_vencl.hw, 402 + [CLKID_VCLK2_OTHER] = &meson8b_vclk2_other.hw, 403 + [CLKID_EDP] = &meson8b_edp.hw, 404 + [CLKID_AO_MEDIA_CPU] = &meson8b_ao_media_cpu.hw, 405 + [CLKID_AO_AHB_SRAM] = &meson8b_ao_ahb_sram.hw, 406 + [CLKID_AO_AHB_BUS] = &meson8b_ao_ahb_bus.hw, 407 + [CLKID_AO_IFACE] = &meson8b_ao_iface.hw, 417 408 }, 418 409 .num = CLK_NR_CLKS, 419 410 }; ··· 499 336 &meson8b_fixed_pll, 500 337 &meson8b_vid_pll, 501 338 &meson8b_sys_pll, 339 + }; 340 + 341 + static struct clk_gate *meson8b_clk_gates[] = { 342 + &meson8b_clk81, 343 + &meson8b_ddr, 344 + &meson8b_dos, 345 + &meson8b_isa, 346 + &meson8b_pl301, 347 + &meson8b_periphs, 348 + &meson8b_spicc, 349 + &meson8b_i2c, 350 + &meson8b_sar_adc, 351 + &meson8b_smart_card, 352 + &meson8b_rng0, 353 + &meson8b_uart0, 354 + &meson8b_sdhc, 355 + &meson8b_stream, 356 + &meson8b_async_fifo, 357 + &meson8b_sdio, 358 + &meson8b_abuf, 359 + &meson8b_hiu_iface, 360 + &meson8b_assist_misc, 361 + &meson8b_spi, 362 + &meson8b_i2s_spdif, 363 + &meson8b_eth, 364 + &meson8b_demux, 365 + &meson8b_aiu_glue, 366 + &meson8b_iec958, 367 + &meson8b_i2s_out, 368 + &meson8b_amclk, 369 + &meson8b_aififo2, 370 + &meson8b_mixer, 371 + &meson8b_mixer_iface, 372 + &meson8b_adc, 373 + &meson8b_blkmv, 374 + &meson8b_aiu, 375 + &meson8b_uart1, 376 + &meson8b_g2d, 377 + &meson8b_usb0, 378 + &meson8b_usb1, 379 + &meson8b_reset, 380 + &meson8b_nand, 381 + &meson8b_dos_parser, 382 + &meson8b_usb, 383 + &meson8b_vdin1, 384 + &meson8b_ahb_arb0, 385 + &meson8b_efuse, 386 + &meson8b_boot_rom, 387 + &meson8b_ahb_data_bus, 388 + &meson8b_ahb_ctrl_bus, 389 + &meson8b_hdmi_intr_sync, 390 + &meson8b_hdmi_pclk, 391 + &meson8b_usb1_ddr_bridge, 392 + &meson8b_usb0_ddr_bridge, 393 + &meson8b_mmc_pclk, 394 + &meson8b_dvin, 395 + &meson8b_uart2, 396 + &meson8b_sana, 397 + &meson8b_vpu_intr, 398 + &meson8b_sec_ahb_ahb3_bridge, 399 + &meson8b_clk81_a9, 400 + &meson8b_vclk2_venci0, 401 + &meson8b_vclk2_venci1, 402 + &meson8b_vclk2_vencp0, 403 + &meson8b_vclk2_vencp1, 404 + &meson8b_gclk_venci_int, 405 + &meson8b_gclk_vencp_int, 406 + &meson8b_dac_clk, 407 + &meson8b_aoclk_gate, 408 + &meson8b_iec958_gate, 409 + &meson8b_enc480p, 410 + &meson8b_rng1, 411 + &meson8b_gclk_vencl_int, 412 + &meson8b_vclk2_venclmcc, 413 + &meson8b_vclk2_vencl, 414 + &meson8b_vclk2_other, 415 + &meson8b_edp, 416 + &meson8b_ao_media_cpu, 417 + &meson8b_ao_ahb_sram, 418 + &meson8b_ao_ahb_bus, 419 + &meson8b_ao_iface, 502 420 }; 503 421 504 422 static int meson8b_clkc_probe(struct platform_device *pdev) ··· 608 364 meson8b_mpeg_clk_sel.reg = clk_base + (u32)meson8b_mpeg_clk_sel.reg; 609 365 meson8b_mpeg_clk_div.reg = clk_base + (u32)meson8b_mpeg_clk_div.reg; 610 366 meson8b_clk81.reg = clk_base + (u32)meson8b_clk81.reg; 367 + 368 + /* Populate base address for gates */ 369 + for (i = 0; i < ARRAY_SIZE(meson8b_clk_gates); i++) 370 + meson8b_clk_gates[i]->reg = clk_base + 371 + (u32)meson8b_clk_gates[i]->reg; 611 372 612 373 /* 613 374 * register all clks
+5
drivers/clk/meson/meson8b.h
··· 30 30 * 31 31 * [0] http://dn.odroid.com/S805/Datasheet/S805_Datasheet%20V0.8%2020150126.pdf 32 32 */ 33 + #define HHI_GCLK_MPEG0 0x140 /* 0x50 offset in data sheet */ 34 + #define HHI_GCLK_MPEG1 0x144 /* 0x51 offset in data sheet */ 35 + #define HHI_GCLK_MPEG2 0x148 /* 0x52 offset in data sheet */ 36 + #define HHI_GCLK_OTHER 0x150 /* 0x54 offset in data sheet */ 37 + #define HHI_GCLK_AO 0x154 /* 0x55 offset in data sheet */ 33 38 #define HHI_SYS_CPU_CLK_CNTL1 0x15c /* 0x57 offset in data sheet */ 34 39 #define HHI_MPEG_CLK_CNTL 0x174 /* 0x5d offset in data sheet */ 35 40 #define HHI_MPLL_CNTL 0x280 /* 0xa0 offset in data sheet */