xref: /freebsd/sys/dev/iicbus/pmic/rockchip/rk817.c (revision fdafd315ad0d0f28a11b9fb4476a9ab059c62b92)
166a3e513SSøren Schmidt /*-
2*90737b63SGanbold Tsagaankhuu  * SPDX-License-Identifier: BSD-2-Clause
366a3e513SSøren Schmidt  *
466a3e513SSøren Schmidt  * Copyright (c) 2021, 2022 Soren Schmidt <sos@deepcore.dk>
566a3e513SSøren Schmidt  *
666a3e513SSøren Schmidt  * Redistribution and use in source and binary forms, with or without
766a3e513SSøren Schmidt  * modification, are permitted provided that the following conditions
866a3e513SSøren Schmidt  * are met:
966a3e513SSøren Schmidt  * 1. Redistributions of source code must retain the above copyright
1066a3e513SSøren Schmidt  *    notice, this list of conditions and the following disclaimer.
1166a3e513SSøren Schmidt  * 2. Redistributions in binary form must reproduce the above copyright
1266a3e513SSøren Schmidt  *    notice, this list of conditions and the following disclaimer in the
1366a3e513SSøren Schmidt  *    documentation and/or other materials provided with the distribution.
1466a3e513SSøren Schmidt  *
1566a3e513SSøren Schmidt  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
1666a3e513SSøren Schmidt  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1766a3e513SSøren Schmidt  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
1866a3e513SSøren Schmidt  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
1966a3e513SSøren Schmidt  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2066a3e513SSøren Schmidt  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2166a3e513SSøren Schmidt  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2266a3e513SSøren Schmidt  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2366a3e513SSøren Schmidt  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2466a3e513SSøren Schmidt  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2566a3e513SSøren Schmidt  * SUCH DAMAGE.
2666a3e513SSøren Schmidt  *
2766a3e513SSøren Schmidt  */
2866a3e513SSøren Schmidt 
2966a3e513SSøren Schmidt #include <sys/param.h>
3066a3e513SSøren Schmidt #include <sys/bus.h>
3166a3e513SSøren Schmidt #include <sys/clock.h>
3266a3e513SSøren Schmidt #include <sys/kernel.h>
3366a3e513SSøren Schmidt #include <sys/module.h>
3466a3e513SSøren Schmidt #include <sys/mutex.h>
3566a3e513SSøren Schmidt #include <sys/rman.h>
3666a3e513SSøren Schmidt #include <machine/bus.h>
3766a3e513SSøren Schmidt 
3866a3e513SSøren Schmidt #include <dev/iicbus/iiconf.h>
3966a3e513SSøren Schmidt #include <dev/iicbus/iicbus.h>
4066a3e513SSøren Schmidt 
4166a3e513SSøren Schmidt #include <dev/ofw/ofw_bus.h>
4266a3e513SSøren Schmidt #include <dev/ofw/ofw_bus_subr.h>
4366a3e513SSøren Schmidt 
4466a3e513SSøren Schmidt #include <dev/iicbus/pmic/rockchip/rk817reg.h>
4566a3e513SSøren Schmidt #include <dev/iicbus/pmic/rockchip/rk8xx.h>
4666a3e513SSøren Schmidt 
4766a3e513SSøren Schmidt 
4866a3e513SSøren Schmidt static struct ofw_compat_data compat_data[] = {
4966a3e513SSøren Schmidt 	{"rockchip,rk809",	RK809},
5066a3e513SSøren Schmidt 	{"rockchip,rk817",	RK817},
5166a3e513SSøren Schmidt 	{NULL,			0}
5266a3e513SSøren Schmidt };
5366a3e513SSøren Schmidt 
5466a3e513SSøren Schmidt static struct rk8xx_regdef rk809_regdefs[] = {
5566a3e513SSøren Schmidt 	{
5666a3e513SSøren Schmidt 		.id = RK809_DCDC1,
5766a3e513SSøren Schmidt 		.name = "DCDC_REG1",
5866a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
5966a3e513SSøren Schmidt 		.enable_mask = 0x11,
6066a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC1_ON_VSEL,
6166a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
6266a3e513SSøren Schmidt 		.voltage_min = 500000,
6366a3e513SSøren Schmidt 		.voltage_max = 1487500,
6466a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
6566a3e513SSøren Schmidt 		.voltage_max2 = 2400000,
6666a3e513SSøren Schmidt 		.voltage_step = 12500,
6766a3e513SSøren Schmidt 		.voltage_step2 = 100000,
6866a3e513SSøren Schmidt 		.voltage_nstep = 177,
6966a3e513SSøren Schmidt 	},
7066a3e513SSøren Schmidt 	{
7166a3e513SSøren Schmidt 		.id = RK809_DCDC2,
7266a3e513SSøren Schmidt 		.name = "DCDC_REG2",
7366a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
7466a3e513SSøren Schmidt 		.enable_mask = 0x22,
7566a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC2_ON_VSEL,
7666a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
7766a3e513SSøren Schmidt 		.voltage_min = 500000,
7866a3e513SSøren Schmidt 		.voltage_max = 1487500,
7966a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
8066a3e513SSøren Schmidt 		.voltage_max2 = 2400000,
8166a3e513SSøren Schmidt 		.voltage_step = 12500,
8266a3e513SSøren Schmidt 		.voltage_step2 = 100000,
8366a3e513SSøren Schmidt 		.voltage_nstep = 177,
8466a3e513SSøren Schmidt 	},
8566a3e513SSøren Schmidt 	{
8666a3e513SSøren Schmidt 		.id = RK809_DCDC3,
8766a3e513SSøren Schmidt 		.name = "DCDC_REG3",
8866a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
8966a3e513SSøren Schmidt 		.enable_mask = 0x44,
9066a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC3_ON_VSEL,
9166a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
9266a3e513SSøren Schmidt 		.voltage_min = 500000,
9366a3e513SSøren Schmidt 		.voltage_max = 1487500,
9466a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
9566a3e513SSøren Schmidt 		.voltage_max2 = 2400000,
9666a3e513SSøren Schmidt 		.voltage_step = 12500,
9766a3e513SSøren Schmidt 		.voltage_step2 = 100000,
9866a3e513SSøren Schmidt 		.voltage_nstep = 177,
9966a3e513SSøren Schmidt 	},
10066a3e513SSøren Schmidt 	{
10166a3e513SSøren Schmidt 		.id = RK809_DCDC4,
10266a3e513SSøren Schmidt 		.name = "DCDC_REG4",
10366a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
10466a3e513SSøren Schmidt 		.enable_mask = 0x88,
10566a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC4_ON_VSEL,
10666a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
10766a3e513SSøren Schmidt 		.voltage_min = 500000,
10866a3e513SSøren Schmidt 		.voltage_max = 1487500,
10966a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
11066a3e513SSøren Schmidt 		.voltage_max2 = 3400000,
11166a3e513SSøren Schmidt 		.voltage_step = 12500,
11266a3e513SSøren Schmidt 		.voltage_step2 = 100000,
11366a3e513SSøren Schmidt 		.voltage_nstep = 195,
11466a3e513SSøren Schmidt 	},
11566a3e513SSøren Schmidt 	{
11666a3e513SSøren Schmidt 		.id = RK809_DCDC5,
11766a3e513SSøren Schmidt 		.name = "DCDC_REG5",
11866a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
11966a3e513SSøren Schmidt 		.enable_mask = 0x22,
12066a3e513SSøren Schmidt 		.voltage_reg = RK817_BOOST_ON_VSEL,
12166a3e513SSøren Schmidt 		.voltage_mask = 0x07,
12266a3e513SSøren Schmidt 		.voltage_min = 1600000,	/* cheat is 1.5V */
12366a3e513SSøren Schmidt 		.voltage_max = 3400000,
12466a3e513SSøren Schmidt 		.voltage_min2 = 3500000,
12566a3e513SSøren Schmidt 		.voltage_max2 = 3600000,
12666a3e513SSøren Schmidt 		.voltage_step = 200000,
12766a3e513SSøren Schmidt 		.voltage_step2 = 300000,
12866a3e513SSøren Schmidt 		.voltage_nstep = 8,
12966a3e513SSøren Schmidt 	},
13066a3e513SSøren Schmidt 	{
13166a3e513SSøren Schmidt 		.id = RK809_LDO1,
13266a3e513SSøren Schmidt 		.name = "LDO_REG1",
13366a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
13466a3e513SSøren Schmidt 		.enable_mask = 0x11,
13566a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO1_ON_VSEL,
13666a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
13766a3e513SSøren Schmidt 		.voltage_min = 600000,
13866a3e513SSøren Schmidt 		.voltage_max = 3400000,
13966a3e513SSøren Schmidt 		.voltage_step = 25000,
14066a3e513SSøren Schmidt 		.voltage_nstep = 112,
14166a3e513SSøren Schmidt 	},
14266a3e513SSøren Schmidt 	{
14366a3e513SSøren Schmidt 		.id = RK809_LDO2,
14466a3e513SSøren Schmidt 		.name = "LDO_REG2",
14566a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
14666a3e513SSøren Schmidt 		.enable_mask = 0x22,
14766a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO2_ON_VSEL,
14866a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
14966a3e513SSøren Schmidt 		.voltage_min = 600000,
15066a3e513SSøren Schmidt 		.voltage_max = 3400000,
15166a3e513SSøren Schmidt 		.voltage_step = 25000,
15266a3e513SSøren Schmidt 		.voltage_nstep = 112,
15366a3e513SSøren Schmidt 	},
15466a3e513SSøren Schmidt 	{
15566a3e513SSøren Schmidt 		.id = RK809_LDO3,
15666a3e513SSøren Schmidt 		.name = "LDO_REG3",
15766a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
15866a3e513SSøren Schmidt 		.enable_mask = 0x44,
15966a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO3_ON_VSEL,
16066a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
16166a3e513SSøren Schmidt 		.voltage_min = 600000,
16266a3e513SSøren Schmidt 		.voltage_max = 3400000,
16366a3e513SSøren Schmidt 		.voltage_step = 25000,
16466a3e513SSøren Schmidt 		.voltage_nstep = 112,
16566a3e513SSøren Schmidt 	},
16666a3e513SSøren Schmidt 	{
16766a3e513SSøren Schmidt 		.id = RK809_LDO4,
16866a3e513SSøren Schmidt 		.name = "LDO_REG4",
16966a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
17066a3e513SSøren Schmidt 		.enable_mask = 0x88,
17166a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO4_ON_VSEL,
17266a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
17366a3e513SSøren Schmidt 		.voltage_min = 600000,
17466a3e513SSøren Schmidt 		.voltage_max = 3400000,
17566a3e513SSøren Schmidt 		.voltage_step = 25000,
17666a3e513SSøren Schmidt 		.voltage_nstep = 112,
17766a3e513SSøren Schmidt 	},
17866a3e513SSøren Schmidt 	{
17966a3e513SSøren Schmidt 		.id = RK809_LDO5,
18066a3e513SSøren Schmidt 		.name = "LDO_REG5",
18166a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
18266a3e513SSøren Schmidt 		.enable_mask = 0x11,
18366a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO5_ON_VSEL,
18466a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
18566a3e513SSøren Schmidt 		.voltage_min = 600000,
18666a3e513SSøren Schmidt 		.voltage_max = 3400000,
18766a3e513SSøren Schmidt 		.voltage_step = 25000,
18866a3e513SSøren Schmidt 		.voltage_nstep = 112,
18966a3e513SSøren Schmidt 	},
19066a3e513SSøren Schmidt 	{
19166a3e513SSøren Schmidt 		.id = RK809_LDO6,
19266a3e513SSøren Schmidt 		.name = "LDO_REG6",
19366a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
19466a3e513SSøren Schmidt 		.enable_mask = 0x22,
19566a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO6_ON_VSEL,
19666a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
19766a3e513SSøren Schmidt 		.voltage_min = 600000,
19866a3e513SSøren Schmidt 		.voltage_max = 3400000,
19966a3e513SSøren Schmidt 		.voltage_step = 25000,
20066a3e513SSøren Schmidt 		.voltage_nstep = 112,
20166a3e513SSøren Schmidt 	},
20266a3e513SSøren Schmidt 	{
20366a3e513SSøren Schmidt 		.id = RK809_LDO7,
20466a3e513SSøren Schmidt 		.name = "LDO_REG7",
20566a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
20666a3e513SSøren Schmidt 		.enable_mask = 0x44,
20766a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO7_ON_VSEL,
20866a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
20966a3e513SSøren Schmidt 		.voltage_min = 600000,
21066a3e513SSøren Schmidt 		.voltage_max = 3400000,
21166a3e513SSøren Schmidt 		.voltage_step = 25000,
21266a3e513SSøren Schmidt 		.voltage_nstep = 112,
21366a3e513SSøren Schmidt 	},
21466a3e513SSøren Schmidt 	{
21566a3e513SSøren Schmidt 		.id = RK809_LDO8,
21666a3e513SSøren Schmidt 		.name = "LDO_REG8",
21766a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
21866a3e513SSøren Schmidt 		.enable_mask = 0x88,
21966a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO8_ON_VSEL,
22066a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
22166a3e513SSøren Schmidt 		.voltage_min = 600000,
22266a3e513SSøren Schmidt 		.voltage_max = 3400000,
22366a3e513SSøren Schmidt 		.voltage_step = 25000,
22466a3e513SSøren Schmidt 		.voltage_nstep = 112,
22566a3e513SSøren Schmidt 	},
22666a3e513SSøren Schmidt 	{
22766a3e513SSøren Schmidt 		.id = RK809_LDO9,
22866a3e513SSøren Schmidt 		.name = "LDO_REG9",
22966a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
23066a3e513SSøren Schmidt 		.enable_mask = 0x11,
23166a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO9_ON_VSEL,
23266a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
23366a3e513SSøren Schmidt 		.voltage_min = 600000,
23466a3e513SSøren Schmidt 		.voltage_max = 3400000,
23566a3e513SSøren Schmidt 		.voltage_step = 25000,
23666a3e513SSøren Schmidt 		.voltage_nstep = 112,
23766a3e513SSøren Schmidt 	},
23866a3e513SSøren Schmidt 	{
23966a3e513SSøren Schmidt 		.id = RK809_SWITCH1,
24066a3e513SSøren Schmidt 		.name = "SWITCH_REG1",
24166a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
24266a3e513SSøren Schmidt 		.enable_mask = 0x44,
24366a3e513SSøren Schmidt 		.voltage_min = 3300000,
24466a3e513SSøren Schmidt 		.voltage_max = 3300000,
24566a3e513SSøren Schmidt 		.voltage_nstep = 0,
24666a3e513SSøren Schmidt 	},
24766a3e513SSøren Schmidt 	{
24866a3e513SSøren Schmidt 		.id = RK809_SWITCH2,
24966a3e513SSøren Schmidt 		.name = "SWITCH_REG2",
25066a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
25166a3e513SSøren Schmidt 		.enable_mask = 0x88,
25266a3e513SSøren Schmidt 		.voltage_min = 3300000,
25366a3e513SSøren Schmidt 		.voltage_max = 3300000,
25466a3e513SSøren Schmidt 		.voltage_nstep = 0,
25566a3e513SSøren Schmidt 	},
25666a3e513SSøren Schmidt };
25766a3e513SSøren Schmidt 
25866a3e513SSøren Schmidt static struct rk8xx_regdef rk817_regdefs[] = {
25966a3e513SSøren Schmidt 	{
26066a3e513SSøren Schmidt 		.id = RK817_DCDC1,
26166a3e513SSøren Schmidt 		.name = "DCDC_REG1",
26266a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
26366a3e513SSøren Schmidt 		.enable_mask = 0x11,
26466a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC1_ON_VSEL,
26566a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
26666a3e513SSøren Schmidt 		.voltage_min = 500000,
26766a3e513SSøren Schmidt 		.voltage_max = 1487500,
26866a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
26966a3e513SSøren Schmidt 		.voltage_max2 = 2400000,
27066a3e513SSøren Schmidt 		.voltage_step = 12500,
27166a3e513SSøren Schmidt 		.voltage_step2 = 100000,
27266a3e513SSøren Schmidt 		.voltage_nstep = 177,
27366a3e513SSøren Schmidt 	},
27466a3e513SSøren Schmidt 	{
27566a3e513SSøren Schmidt 		.id = RK817_DCDC2,
27666a3e513SSøren Schmidt 		.name = "DCDC_REG2",
27766a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
27866a3e513SSøren Schmidt 		.enable_mask = 0x22,
27966a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC2_ON_VSEL,
28066a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
28166a3e513SSøren Schmidt 		.voltage_min = 500000,
28266a3e513SSøren Schmidt 		.voltage_max = 1487500,
28366a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
28466a3e513SSøren Schmidt 		.voltage_max2 = 2400000,
28566a3e513SSøren Schmidt 		.voltage_step = 12500,
28666a3e513SSøren Schmidt 		.voltage_step2 = 100000,
28766a3e513SSøren Schmidt 		.voltage_nstep = 177,
28866a3e513SSøren Schmidt 	},
28966a3e513SSøren Schmidt 	{
29066a3e513SSøren Schmidt 		.id = RK817_DCDC3,
29166a3e513SSøren Schmidt 		.name = "DCDC_REG3",
29266a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
29366a3e513SSøren Schmidt 		.enable_mask = 0x44,
29466a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC3_ON_VSEL,
29566a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
29666a3e513SSøren Schmidt 		.voltage_min = 500000,
29766a3e513SSøren Schmidt 		.voltage_max = 1487500,
29866a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
29966a3e513SSøren Schmidt 		.voltage_max2 = 2400000,
30066a3e513SSøren Schmidt 		.voltage_step = 12500,
30166a3e513SSøren Schmidt 		.voltage_step2 = 100000,
30266a3e513SSøren Schmidt 		.voltage_nstep = 177,
30366a3e513SSøren Schmidt 	},
30466a3e513SSøren Schmidt 	{
30566a3e513SSøren Schmidt 		.id = RK817_DCDC4,
30666a3e513SSøren Schmidt 		.name = "DCDC_REG4",
30766a3e513SSøren Schmidt 		.enable_reg = RK817_DCDC_EN,
30866a3e513SSøren Schmidt 		.enable_mask = 0x88,
30966a3e513SSøren Schmidt 		.voltage_reg = RK817_DCDC4_ON_VSEL,
31066a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
31166a3e513SSøren Schmidt 		.voltage_min = 500000,
31266a3e513SSøren Schmidt 		.voltage_max = 1487500,
31366a3e513SSøren Schmidt 		.voltage_min2 = 1500000,
31466a3e513SSøren Schmidt 		.voltage_max2 = 3400000,
31566a3e513SSøren Schmidt 		.voltage_step = 12500,
31666a3e513SSøren Schmidt 		.voltage_step2 = 100000,
31766a3e513SSøren Schmidt 		.voltage_nstep = 195,
31866a3e513SSøren Schmidt 	},
31966a3e513SSøren Schmidt 	{
32066a3e513SSøren Schmidt 		.id = RK817_LDO1,
32166a3e513SSøren Schmidt 		.name = "LDO_REG1",
32266a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
32366a3e513SSøren Schmidt 		.enable_mask = 0x11,
32466a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO1_ON_VSEL,
32566a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
32666a3e513SSøren Schmidt 		.voltage_min = 600000,
32766a3e513SSøren Schmidt 		.voltage_max = 3400000,
32866a3e513SSøren Schmidt 		.voltage_step = 25000,
32966a3e513SSøren Schmidt 		.voltage_nstep = 112,
33066a3e513SSøren Schmidt 	},
33166a3e513SSøren Schmidt 	{
33266a3e513SSøren Schmidt 		.id = RK817_LDO2,
33366a3e513SSøren Schmidt 		.name = "LDO_REG2",
33466a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
33566a3e513SSøren Schmidt 		.enable_mask = 0x22,
33666a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO2_ON_VSEL,
33766a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
33866a3e513SSøren Schmidt 		.voltage_min = 600000,
33966a3e513SSøren Schmidt 		.voltage_max = 3400000,
34066a3e513SSøren Schmidt 		.voltage_step = 25000,
34166a3e513SSøren Schmidt 		.voltage_nstep = 112,
34266a3e513SSøren Schmidt 	},
34366a3e513SSøren Schmidt 	{
34466a3e513SSøren Schmidt 		.id = RK817_LDO3,
34566a3e513SSøren Schmidt 		.name = "LDO_REG3",
34666a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
34766a3e513SSøren Schmidt 		.enable_mask = 0x44,
34866a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO3_ON_VSEL,
34966a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
35066a3e513SSøren Schmidt 		.voltage_min = 600000,
35166a3e513SSøren Schmidt 		.voltage_max = 3400000,
35266a3e513SSøren Schmidt 		.voltage_step = 25000,
35366a3e513SSøren Schmidt 		.voltage_nstep = 112,
35466a3e513SSøren Schmidt 	},
35566a3e513SSøren Schmidt 	{
35666a3e513SSøren Schmidt 		.id = RK817_LDO4,
35766a3e513SSøren Schmidt 		.name = "LDO_REG4",
35866a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN1,
35966a3e513SSøren Schmidt 		.enable_mask = 0x88,
36066a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO4_ON_VSEL,
36166a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
36266a3e513SSøren Schmidt 		.voltage_min = 600000,
36366a3e513SSøren Schmidt 		.voltage_max = 3400000,
36466a3e513SSøren Schmidt 		.voltage_step = 25000,
36566a3e513SSøren Schmidt 		.voltage_nstep = 112,
36666a3e513SSøren Schmidt 	},
36766a3e513SSøren Schmidt 	{
36866a3e513SSøren Schmidt 		.id = RK817_LDO5,
36966a3e513SSøren Schmidt 		.name = "LDO_REG5",
37066a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
37166a3e513SSøren Schmidt 		.enable_mask = 0x11,
37266a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO5_ON_VSEL,
37366a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
37466a3e513SSøren Schmidt 		.voltage_min = 600000,
37566a3e513SSøren Schmidt 		.voltage_max = 3400000,
37666a3e513SSøren Schmidt 		.voltage_step = 25000,
37766a3e513SSøren Schmidt 		.voltage_nstep = 112,
37866a3e513SSøren Schmidt 	},
37966a3e513SSøren Schmidt 	{
38066a3e513SSøren Schmidt 		.id = RK817_LDO6,
38166a3e513SSøren Schmidt 		.name = "LDO_REG6",
38266a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
38366a3e513SSøren Schmidt 		.enable_mask = 0x22,
38466a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO6_ON_VSEL,
38566a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
38666a3e513SSøren Schmidt 		.voltage_min = 600000,
38766a3e513SSøren Schmidt 		.voltage_max = 3400000,
38866a3e513SSøren Schmidt 		.voltage_step = 25000,
38966a3e513SSøren Schmidt 		.voltage_nstep = 112,
39066a3e513SSøren Schmidt 	},
39166a3e513SSøren Schmidt 	{
39266a3e513SSøren Schmidt 		.id = RK817_LDO7,
39366a3e513SSøren Schmidt 		.name = "LDO_REG7",
39466a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
39566a3e513SSøren Schmidt 		.enable_mask = 0x44,
39666a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO7_ON_VSEL,
39766a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
39866a3e513SSøren Schmidt 		.voltage_min = 600000,
39966a3e513SSøren Schmidt 		.voltage_max = 3400000,
40066a3e513SSøren Schmidt 		.voltage_step = 25000,
40166a3e513SSøren Schmidt 		.voltage_nstep = 112,
40266a3e513SSøren Schmidt 	},
40366a3e513SSøren Schmidt 	{
40466a3e513SSøren Schmidt 		.id = RK817_LDO8,
40566a3e513SSøren Schmidt 		.name = "LDO_REG8",
40666a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN2,
40766a3e513SSøren Schmidt 		.enable_mask = 0x88,
40866a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO8_ON_VSEL,
40966a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
41066a3e513SSøren Schmidt 		.voltage_min = 600000,
41166a3e513SSøren Schmidt 		.voltage_max = 3400000,
41266a3e513SSøren Schmidt 		.voltage_step = 25000,
41366a3e513SSøren Schmidt 		.voltage_nstep = 112,
41466a3e513SSøren Schmidt 	},
41566a3e513SSøren Schmidt 	{
41666a3e513SSøren Schmidt 		.id = RK817_LDO9,
41766a3e513SSøren Schmidt 		.name = "LDO_REG9",
41866a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
41966a3e513SSøren Schmidt 		.enable_mask = 0x11,
42066a3e513SSøren Schmidt 		.voltage_reg = RK817_LDO9_ON_VSEL,
42166a3e513SSøren Schmidt 		.voltage_mask = 0x7f,
42266a3e513SSøren Schmidt 		.voltage_min = 600000,
42366a3e513SSøren Schmidt 		.voltage_max = 3400000,
42466a3e513SSøren Schmidt 		.voltage_step = 25000,
42566a3e513SSøren Schmidt 		.voltage_nstep = 112,
42666a3e513SSøren Schmidt 	},
42766a3e513SSøren Schmidt 	{
42866a3e513SSøren Schmidt 		.id = RK817_BOOST,
42966a3e513SSøren Schmidt 		.name = "BOOST",
43066a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
43166a3e513SSøren Schmidt 		.enable_mask = 0x22,
43266a3e513SSøren Schmidt 		.voltage_reg = RK817_BOOST_ON_VSEL,
43366a3e513SSøren Schmidt 		.voltage_mask = 0x07,
43466a3e513SSøren Schmidt 		.voltage_min = 4700000,
43566a3e513SSøren Schmidt 		.voltage_max = 5400000,
43666a3e513SSøren Schmidt 		.voltage_step = 100000,
43766a3e513SSøren Schmidt 		.voltage_nstep = 8,
43866a3e513SSøren Schmidt 	},
43966a3e513SSøren Schmidt 	{
44066a3e513SSøren Schmidt 		.id = RK817_OTG_SWITCH,
44166a3e513SSøren Schmidt 		.name = "OTG_SWITCH",
44266a3e513SSøren Schmidt 		.enable_reg = RK817_LDO_EN3,
44366a3e513SSøren Schmidt 		.enable_mask = 0x44,
44466a3e513SSøren Schmidt 		.voltage_nstep = 0,
44566a3e513SSøren Schmidt 	},
44666a3e513SSøren Schmidt };
44766a3e513SSøren Schmidt 
44866a3e513SSøren Schmidt static int
rk817_probe(device_t dev)44966a3e513SSøren Schmidt rk817_probe(device_t dev)
45066a3e513SSøren Schmidt {
45166a3e513SSøren Schmidt 	if (!ofw_bus_status_okay(dev))
45266a3e513SSøren Schmidt 		return (ENXIO);
45366a3e513SSøren Schmidt 
45466a3e513SSøren Schmidt 	switch (ofw_bus_search_compatible(dev, compat_data)->ocd_data) {
45566a3e513SSøren Schmidt 	case RK809:
45666a3e513SSøren Schmidt 		device_set_desc(dev, "RockChip RK809 PMIC");
45766a3e513SSøren Schmidt 		break;
45866a3e513SSøren Schmidt 	case RK817:
45966a3e513SSøren Schmidt 		device_set_desc(dev, "RockChip RK817 PMIC");
46066a3e513SSøren Schmidt 		break;
46166a3e513SSøren Schmidt 	default:
46266a3e513SSøren Schmidt 		return (ENXIO);
46366a3e513SSøren Schmidt 	}
46466a3e513SSøren Schmidt 
46566a3e513SSøren Schmidt 	return (BUS_PROBE_DEFAULT);
46666a3e513SSøren Schmidt }
46766a3e513SSøren Schmidt 
46866a3e513SSøren Schmidt static int
rk817_attach(device_t dev)46966a3e513SSøren Schmidt rk817_attach(device_t dev)
47066a3e513SSøren Schmidt {
47166a3e513SSøren Schmidt 	struct rk8xx_softc *sc;
47266a3e513SSøren Schmidt 
47366a3e513SSøren Schmidt 	sc = device_get_softc(dev);
47466a3e513SSøren Schmidt 	sc->dev = dev;
47566a3e513SSøren Schmidt 
47666a3e513SSøren Schmidt 	sc->type = ofw_bus_search_compatible(dev, compat_data)->ocd_data;
47766a3e513SSøren Schmidt 	switch (sc->type) {
47866a3e513SSøren Schmidt 	case RK809:
47966a3e513SSøren Schmidt 		sc->regdefs = rk809_regdefs;
48066a3e513SSøren Schmidt 		sc->nregs = nitems(rk809_regdefs);
48166a3e513SSøren Schmidt 		break;
48266a3e513SSøren Schmidt 	case RK817:
48366a3e513SSøren Schmidt 		sc->regdefs = rk817_regdefs;
48466a3e513SSøren Schmidt 		sc->nregs = nitems(rk817_regdefs);
48566a3e513SSøren Schmidt 		break;
48666a3e513SSøren Schmidt 	default:
48766a3e513SSøren Schmidt 		device_printf(dev, "Unknown type %d\n", sc->type);
48866a3e513SSøren Schmidt 		return (ENXIO);
48966a3e513SSøren Schmidt 	}
49066a3e513SSøren Schmidt 	sc->rtc_regs.secs = RK817_RTC_SECONDS;
49166a3e513SSøren Schmidt 	sc->rtc_regs.secs_mask = RK817_RTC_SECONDS_MASK;
49266a3e513SSøren Schmidt 	sc->rtc_regs.minutes = RK817_RTC_MINUTES;
49366a3e513SSøren Schmidt 	sc->rtc_regs.minutes_mask = RK817_RTC_MINUTES_MASK;
49466a3e513SSøren Schmidt 	sc->rtc_regs.hours = RK817_RTC_HOURS;
49566a3e513SSøren Schmidt 	sc->rtc_regs.hours_mask = RK817_RTC_HOURS_MASK;
49666a3e513SSøren Schmidt 	sc->rtc_regs.days = RK817_RTC_DAYS;
49766a3e513SSøren Schmidt 	sc->rtc_regs.days_mask = RK817_RTC_DAYS_MASK;
49866a3e513SSøren Schmidt 	sc->rtc_regs.months = RK817_RTC_MONTHS;
49966a3e513SSøren Schmidt 	sc->rtc_regs.months_mask = RK817_RTC_MONTHS_MASK;
50066a3e513SSøren Schmidt 	sc->rtc_regs.years = RK817_RTC_YEARS;
50166a3e513SSøren Schmidt 	sc->rtc_regs.weeks = RK817_RTC_WEEKS_MASK;
50266a3e513SSøren Schmidt 	sc->rtc_regs.ctrl = RK817_RTC_CTRL;
50366a3e513SSøren Schmidt 	sc->rtc_regs.ctrl_stop_mask = RK817_RTC_CTRL_STOP;
50466a3e513SSøren Schmidt 	sc->rtc_regs.ctrl_ampm_mask = RK817_RTC_AMPM_MODE;
50566a3e513SSøren Schmidt 	sc->rtc_regs.ctrl_gettime_mask = RK817_RTC_GET_TIME;
50666a3e513SSøren Schmidt 	sc->rtc_regs.ctrl_readsel_mask = RK817_RTC_READSEL;
50766a3e513SSøren Schmidt 	sc->dev_ctrl.dev_ctrl_reg = RK817_SYS_CFG3;
50866a3e513SSøren Schmidt 	sc->dev_ctrl.pwr_off_mask = RK817_SYS_CFG3_OFF;
50966a3e513SSøren Schmidt 	sc->dev_ctrl.pwr_rst_mask = RK817_SYS_CFG3_RST;
51066a3e513SSøren Schmidt 
51166a3e513SSøren Schmidt 	return (rk8xx_attach(sc));
51266a3e513SSøren Schmidt }
51366a3e513SSøren Schmidt 
51466a3e513SSøren Schmidt static device_method_t rk817_methods[] = {
51566a3e513SSøren Schmidt 	DEVMETHOD(device_probe,		rk817_probe),
51666a3e513SSøren Schmidt 	DEVMETHOD(device_attach,	rk817_attach),
51766a3e513SSøren Schmidt 
51866a3e513SSøren Schmidt 	DEVMETHOD_END
51966a3e513SSøren Schmidt };
52066a3e513SSøren Schmidt 
52166a3e513SSøren Schmidt DEFINE_CLASS_1(rk817_pmu, rk817_driver, rk817_methods,
52266a3e513SSøren Schmidt     sizeof(struct rk8xx_softc), rk8xx_driver);
52366a3e513SSøren Schmidt 
52466a3e513SSøren Schmidt EARLY_DRIVER_MODULE(rk817_pmu, iicbus, rk817_driver, 0, 0,
525571e5792SSøren Schmidt     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
52666a3e513SSøren Schmidt EARLY_DRIVER_MODULE(iicbus, rk817_pmu, iicbus_driver, 0, 0,
527571e5792SSøren Schmidt     BUS_PASS_INTERRUPT + BUS_PASS_ORDER_LATE);
52866a3e513SSøren Schmidt MODULE_DEPEND(rk817_pmu, iicbus, IICBUS_MINVER, IICBUS_PREFVER, IICBUS_MAXVER);
52966a3e513SSøren Schmidt MODULE_VERSION(rk817_pmu, 1);
530