150752790SStefan Roese /*
250752790SStefan Roese * (C) Copyright 2009 Stefan Roese <sr@denx.de>, DENX Software Engineering
350752790SStefan Roese *
450752790SStefan Roese * Original Author Guenter Gebhardt
550752790SStefan Roese * Copyright (C) 2006 Micronas GmbH
650752790SStefan Roese *
71a459660SWolfgang Denk * SPDX-License-Identifier: GPL-2.0+
850752790SStefan Roese */
950752790SStefan Roese
1050752790SStefan Roese #include <common.h>
11*1221ce45SMasahiro Yamada #include <linux/errno.h>
1250752790SStefan Roese
1350752790SStefan Roese #include "vct.h"
1450752790SStefan Roese
dcgu_set_clk_switch(enum dcgu_hw_module module,enum dcgu_switch setup)1550752790SStefan Roese int dcgu_set_clk_switch(enum dcgu_hw_module module, enum dcgu_switch setup)
1650752790SStefan Roese {
1750752790SStefan Roese u32 enable;
1850752790SStefan Roese union dcgu_clk_en1 en1;
1950752790SStefan Roese union dcgu_clk_en2 en2;
2050752790SStefan Roese
2150752790SStefan Roese switch (setup) {
2250752790SStefan Roese case DCGU_SWITCH_ON:
2350752790SStefan Roese enable = 1;
2450752790SStefan Roese break;
2550752790SStefan Roese case DCGU_SWITCH_OFF:
2650752790SStefan Roese enable = 0;
2750752790SStefan Roese break;
2850752790SStefan Roese default:
2950752790SStefan Roese printf("%s:%i:Invalid clock switch: %i\n", __FILE__, __LINE__,
3050752790SStefan Roese setup);
3150752790SStefan Roese return -EINVAL;
3250752790SStefan Roese }
3350752790SStefan Roese
3450752790SStefan Roese if (module == DCGU_HW_MODULE_CPU)
3550752790SStefan Roese en2.reg = reg_read(DCGU_CLK_EN2(DCGU_BASE));
3650752790SStefan Roese else
3750752790SStefan Roese en1.reg = reg_read(DCGU_CLK_EN1(DCGU_BASE));
3850752790SStefan Roese
3950752790SStefan Roese switch (module) {
4050752790SStefan Roese case DCGU_HW_MODULE_MSMC:
4150752790SStefan Roese en1.bits.en_clkmsmc = enable;
4250752790SStefan Roese break;
4350752790SStefan Roese case DCGU_HW_MODULE_SSI_S:
4450752790SStefan Roese en1.bits.en_clkssi_s = enable;
4550752790SStefan Roese break;
4650752790SStefan Roese case DCGU_HW_MODULE_SSI_M:
4750752790SStefan Roese en1.bits.en_clkssi_m = enable;
4850752790SStefan Roese break;
4950752790SStefan Roese case DCGU_HW_MODULE_SMC:
5050752790SStefan Roese en1.bits.en_clksmc = enable;
5150752790SStefan Roese break;
5250752790SStefan Roese case DCGU_HW_MODULE_EBI:
5350752790SStefan Roese en1.bits.en_clkebi = enable;
5450752790SStefan Roese break;
5550752790SStefan Roese case DCGU_HW_MODULE_USB_PLL:
5650752790SStefan Roese en1.bits.en_usbpll = enable;
5750752790SStefan Roese break;
5850752790SStefan Roese case DCGU_HW_MODULE_USB_60:
5950752790SStefan Roese en1.bits.en_clkusb60 = enable;
6050752790SStefan Roese break;
6150752790SStefan Roese case DCGU_HW_MODULE_USB_24:
6250752790SStefan Roese en1.bits.en_clkusb24 = enable;
6350752790SStefan Roese break;
6450752790SStefan Roese case DCGU_HW_MODULE_UART_2:
6550752790SStefan Roese en1.bits.en_clkuart2 = enable;
6650752790SStefan Roese break;
6750752790SStefan Roese case DCGU_HW_MODULE_UART_1:
6850752790SStefan Roese en1.bits.en_clkuart1 = enable;
6950752790SStefan Roese break;
7050752790SStefan Roese case DCGU_HW_MODULE_PERI:
7150752790SStefan Roese en1.bits.en_clkperi20 = enable;
7250752790SStefan Roese break;
7350752790SStefan Roese case DCGU_HW_MODULE_CPU:
7450752790SStefan Roese en2.bits.en_clkcpu = enable;
7550752790SStefan Roese break;
7650752790SStefan Roese case DCGU_HW_MODULE_I2S:
7750752790SStefan Roese en1.bits.en_clk_i2s_dly = enable;
7850752790SStefan Roese break;
7950752790SStefan Roese case DCGU_HW_MODULE_ABP_SCC:
8050752790SStefan Roese en1.bits.en_clk_scc_abp = enable;
8150752790SStefan Roese break;
8250752790SStefan Roese case DCGU_HW_MODULE_SPDIF:
8350752790SStefan Roese en1.bits.en_clk_dtv_spdo = enable;
8450752790SStefan Roese break;
8550752790SStefan Roese case DCGU_HW_MODULE_AD:
8650752790SStefan Roese en1.bits.en_clkad = enable;
8750752790SStefan Roese break;
8850752790SStefan Roese case DCGU_HW_MODULE_MVD:
8950752790SStefan Roese en1.bits.en_clkmvd = enable;
9050752790SStefan Roese break;
9150752790SStefan Roese case DCGU_HW_MODULE_TSD:
9250752790SStefan Roese en1.bits.en_clktsd = enable;
9350752790SStefan Roese break;
9450752790SStefan Roese case DCGU_HW_MODULE_GA:
9550752790SStefan Roese en1.bits.en_clkga = enable;
9650752790SStefan Roese break;
9750752790SStefan Roese case DCGU_HW_MODULE_DVP:
9850752790SStefan Roese en1.bits.en_clkdvp = enable;
9950752790SStefan Roese break;
10050752790SStefan Roese case DCGU_HW_MODULE_MR2:
10150752790SStefan Roese en1.bits.en_clkmr2 = enable;
10250752790SStefan Roese break;
10350752790SStefan Roese case DCGU_HW_MODULE_MR1:
10450752790SStefan Roese en1.bits.en_clkmr1 = enable;
10550752790SStefan Roese break;
10650752790SStefan Roese default:
10750752790SStefan Roese printf("%s:%i:Invalid hardware module: %i\n", __FILE__,
10850752790SStefan Roese __LINE__, module);
10950752790SStefan Roese return -EINVAL;
11050752790SStefan Roese }
11150752790SStefan Roese
11250752790SStefan Roese /*
11350752790SStefan Roese * The reg_read() following the reg_write() below forces the write to
11450752790SStefan Roese * be really done on the bus.
11550752790SStefan Roese * Otherwise the clock may not be switched on when this API function
11650752790SStefan Roese * returns, which may cause an bus error if a registers of the hardware
11750752790SStefan Roese * module connected to the clock is accessed.
11850752790SStefan Roese */
11950752790SStefan Roese if (module == DCGU_HW_MODULE_CPU) {
12050752790SStefan Roese reg_write(DCGU_CLK_EN2(DCGU_BASE), en2.reg);
12150752790SStefan Roese en2.reg = reg_read(DCGU_CLK_EN2(DCGU_BASE));
12250752790SStefan Roese } else {
12350752790SStefan Roese reg_write(DCGU_CLK_EN1(DCGU_BASE), en1.reg);
12450752790SStefan Roese en1.reg = reg_read(DCGU_CLK_EN1(DCGU_BASE));
12550752790SStefan Roese }
12650752790SStefan Roese
12750752790SStefan Roese return 0;
12850752790SStefan Roese }
12950752790SStefan Roese
dcgu_set_reset_switch(enum dcgu_hw_module module,enum dcgu_switch setup)13050752790SStefan Roese int dcgu_set_reset_switch(enum dcgu_hw_module module, enum dcgu_switch setup)
13150752790SStefan Roese {
13250752790SStefan Roese union dcgu_reset_unit1 val;
13350752790SStefan Roese u32 enable;
13450752790SStefan Roese
13550752790SStefan Roese switch (setup) {
13650752790SStefan Roese case DCGU_SWITCH_ON:
13750752790SStefan Roese enable = 1;
13850752790SStefan Roese break;
13950752790SStefan Roese case DCGU_SWITCH_OFF:
14050752790SStefan Roese enable = 0;
14150752790SStefan Roese break;
14250752790SStefan Roese default:
14350752790SStefan Roese printf("%s:%i:Invalid reset switch: %i\n", __FILE__, __LINE__,
14450752790SStefan Roese setup);
14550752790SStefan Roese return -EINVAL;
14650752790SStefan Roese }
14750752790SStefan Roese
14850752790SStefan Roese val.reg = reg_read(DCGU_RESET_UNIT1(DCGU_BASE));
14950752790SStefan Roese switch (module) {
15050752790SStefan Roese case DCGU_HW_MODULE_MSMC:
15150752790SStefan Roese val.bits.swreset_clkmsmc = enable;
15250752790SStefan Roese break;
15350752790SStefan Roese case DCGU_HW_MODULE_SSI_S:
15450752790SStefan Roese val.bits.swreset_clkssi_s = enable;
15550752790SStefan Roese break;
15650752790SStefan Roese case DCGU_HW_MODULE_SSI_M:
15750752790SStefan Roese val.bits.swreset_clkssi_m = enable;
15850752790SStefan Roese break;
15950752790SStefan Roese case DCGU_HW_MODULE_SMC:
16050752790SStefan Roese val.bits.swreset_clksmc = enable;
16150752790SStefan Roese break;
16250752790SStefan Roese case DCGU_HW_MODULE_EBI:
16350752790SStefan Roese val.bits.swreset_clkebi = enable;
16450752790SStefan Roese break;
16550752790SStefan Roese case DCGU_HW_MODULE_USB_60:
16650752790SStefan Roese val.bits.swreset_clkusb60 = enable;
16750752790SStefan Roese break;
16850752790SStefan Roese case DCGU_HW_MODULE_USB_24:
16950752790SStefan Roese val.bits.swreset_clkusb24 = enable;
17050752790SStefan Roese break;
17150752790SStefan Roese case DCGU_HW_MODULE_UART_2:
17250752790SStefan Roese val.bits.swreset_clkuart2 = enable;
17350752790SStefan Roese break;
17450752790SStefan Roese case DCGU_HW_MODULE_UART_1:
17550752790SStefan Roese val.bits.swreset_clkuart1 = enable;
17650752790SStefan Roese break;
17750752790SStefan Roese case DCGU_HW_MODULE_PWM:
17850752790SStefan Roese val.bits.swreset_pwm = enable;
17950752790SStefan Roese break;
18050752790SStefan Roese case DCGU_HW_MODULE_GPT:
18150752790SStefan Roese val.bits.swreset_gpt = enable;
18250752790SStefan Roese break;
18350752790SStefan Roese case DCGU_HW_MODULE_I2C2:
18450752790SStefan Roese val.bits.swreset_i2c2 = enable;
18550752790SStefan Roese break;
18650752790SStefan Roese case DCGU_HW_MODULE_I2C1:
18750752790SStefan Roese val.bits.swreset_i2c1 = enable;
18850752790SStefan Roese break;
18950752790SStefan Roese case DCGU_HW_MODULE_GPIO2:
19050752790SStefan Roese val.bits.swreset_gpio2 = enable;
19150752790SStefan Roese break;
19250752790SStefan Roese case DCGU_HW_MODULE_GPIO1:
19350752790SStefan Roese val.bits.swreset_gpio1 = enable;
19450752790SStefan Roese break;
19550752790SStefan Roese case DCGU_HW_MODULE_CPU:
19650752790SStefan Roese val.bits.swreset_clkcpu = enable;
19750752790SStefan Roese break;
19850752790SStefan Roese case DCGU_HW_MODULE_I2S:
19950752790SStefan Roese val.bits.swreset_clk_i2s_dly = enable;
20050752790SStefan Roese break;
20150752790SStefan Roese case DCGU_HW_MODULE_ABP_SCC:
20250752790SStefan Roese val.bits.swreset_clk_scc_abp = enable;
20350752790SStefan Roese break;
20450752790SStefan Roese case DCGU_HW_MODULE_SPDIF:
20550752790SStefan Roese val.bits.swreset_clk_dtv_spdo = enable;
20650752790SStefan Roese break;
20750752790SStefan Roese case DCGU_HW_MODULE_AD:
20850752790SStefan Roese val.bits.swreset_clkad = enable;
20950752790SStefan Roese break;
21050752790SStefan Roese case DCGU_HW_MODULE_MVD:
21150752790SStefan Roese val.bits.swreset_clkmvd = enable;
21250752790SStefan Roese break;
21350752790SStefan Roese case DCGU_HW_MODULE_TSD:
21450752790SStefan Roese val.bits.swreset_clktsd = enable;
21550752790SStefan Roese break;
21650752790SStefan Roese case DCGU_HW_MODULE_TSIO:
21750752790SStefan Roese val.bits.swreset_clktsio = enable;
21850752790SStefan Roese break;
21950752790SStefan Roese case DCGU_HW_MODULE_GA:
22050752790SStefan Roese val.bits.swreset_clkga = enable;
22150752790SStefan Roese break;
22250752790SStefan Roese case DCGU_HW_MODULE_MPC:
22350752790SStefan Roese val.bits.swreset_clkmpc = enable;
22450752790SStefan Roese break;
22550752790SStefan Roese case DCGU_HW_MODULE_CVE:
22650752790SStefan Roese val.bits.swreset_clkcve = enable;
22750752790SStefan Roese break;
22850752790SStefan Roese case DCGU_HW_MODULE_DVP:
22950752790SStefan Roese val.bits.swreset_clkdvp = enable;
23050752790SStefan Roese break;
23150752790SStefan Roese case DCGU_HW_MODULE_MR2:
23250752790SStefan Roese val.bits.swreset_clkmr2 = enable;
23350752790SStefan Roese break;
23450752790SStefan Roese case DCGU_HW_MODULE_MR1:
23550752790SStefan Roese val.bits.swreset_clkmr1 = enable;
23650752790SStefan Roese break;
23750752790SStefan Roese default:
23850752790SStefan Roese printf("%s:%i:Invalid hardware module: %i\n", __FILE__,
23950752790SStefan Roese __LINE__, module);
24050752790SStefan Roese return -EINVAL;
24150752790SStefan Roese }
24250752790SStefan Roese reg_write(DCGU_RESET_UNIT1(DCGU_BASE), val.reg);
24350752790SStefan Roese
24450752790SStefan Roese return 0;
24550752790SStefan Roese }
246