xref: /rk3399_rockchip-uboot/drivers/power/power_spi.c (revision 505cf4750ae55e711663538b3ec7a294c08e7417)
1316a51beSŁukasz Majewski /*
2316a51beSŁukasz Majewski  * Copyright (C) 2011 Samsung Electronics
3316a51beSŁukasz Majewski  * Lukasz Majewski <l.majewski@samsung.com>
4316a51beSŁukasz Majewski  *
5316a51beSŁukasz Majewski  * (C) Copyright 2010
6316a51beSŁukasz Majewski  * Stefano Babic, DENX Software Engineering, sbabic@denx.de
7316a51beSŁukasz Majewski  *
8316a51beSŁukasz Majewski  * (C) Copyright 2008-2009 Freescale Semiconductor, Inc.
9316a51beSŁukasz Majewski  *
101a459660SWolfgang Denk  * SPDX-License-Identifier:	GPL-2.0+
11316a51beSŁukasz Majewski  */
12316a51beSŁukasz Majewski 
13316a51beSŁukasz Majewski #include <common.h>
14316a51beSŁukasz Majewski #include <linux/types.h>
15316a51beSŁukasz Majewski #include <power/pmic.h>
16316a51beSŁukasz Majewski #include <spi.h>
17316a51beSŁukasz Majewski 
18316a51beSŁukasz Majewski static struct spi_slave *slave;
19316a51beSŁukasz Majewski 
pmic_reg(struct pmic * p,u32 reg,u32 * val,u32 write)20316a51beSŁukasz Majewski static u32 pmic_reg(struct pmic *p, u32 reg, u32 *val, u32 write)
21316a51beSŁukasz Majewski {
22316a51beSŁukasz Majewski 	u32 pmic_tx, pmic_rx;
23316a51beSŁukasz Majewski 	u32 tmp;
24316a51beSŁukasz Majewski 
25316a51beSŁukasz Majewski 	if (!slave) {
265b471deeSTom Rini 		slave = spi_setup_slave(p->bus, p->hw.spi.cs, p->hw.spi.clk,
275b471deeSTom Rini 					p->hw.spi.mode);
28316a51beSŁukasz Majewski 
29316a51beSŁukasz Majewski 		if (!slave)
30*505cf475SJaehoon Chung 			return -ENODEV;
31316a51beSŁukasz Majewski 	}
32316a51beSŁukasz Majewski 
33316a51beSŁukasz Majewski 	if (check_reg(p, reg))
34*505cf475SJaehoon Chung 		return -EINVAL;
35316a51beSŁukasz Majewski 
36316a51beSŁukasz Majewski 	if (spi_claim_bus(slave))
37*505cf475SJaehoon Chung 		return -EBUSY;
38316a51beSŁukasz Majewski 
39316a51beSŁukasz Majewski 	pmic_tx = p->hw.spi.prepare_tx(reg, val, write);
40316a51beSŁukasz Majewski 
41316a51beSŁukasz Majewski 	tmp = cpu_to_be32(pmic_tx);
42316a51beSŁukasz Majewski 
43316a51beSŁukasz Majewski 	if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx,
445b471deeSTom Rini 			pmic_spi_flags))
455b471deeSTom Rini 		goto err;
46316a51beSŁukasz Majewski 
47316a51beSŁukasz Majewski 	if (write) {
48316a51beSŁukasz Majewski 		pmic_tx = p->hw.spi.prepare_tx(reg, val, 0);
49316a51beSŁukasz Majewski 		tmp = cpu_to_be32(pmic_tx);
50316a51beSŁukasz Majewski 		if (spi_xfer(slave, pmic_spi_bitlen, &tmp, &pmic_rx,
515b471deeSTom Rini 			pmic_spi_flags))
525b471deeSTom Rini 			goto err;
53316a51beSŁukasz Majewski 	}
54316a51beSŁukasz Majewski 
55316a51beSŁukasz Majewski 	spi_release_bus(slave);
56316a51beSŁukasz Majewski 	*val = cpu_to_be32(pmic_rx);
57316a51beSŁukasz Majewski 
58316a51beSŁukasz Majewski 	return 0;
595b471deeSTom Rini 
605b471deeSTom Rini err:
615b471deeSTom Rini 	spi_release_bus(slave);
62*505cf475SJaehoon Chung 	return -ENOTSUPP;
63316a51beSŁukasz Majewski }
64316a51beSŁukasz Majewski 
pmic_reg_write(struct pmic * p,u32 reg,u32 val)65316a51beSŁukasz Majewski int pmic_reg_write(struct pmic *p, u32 reg, u32 val)
66316a51beSŁukasz Majewski {
67*505cf475SJaehoon Chung 	return pmic_reg(p, reg, &val, 1);
68316a51beSŁukasz Majewski }
69316a51beSŁukasz Majewski 
pmic_reg_read(struct pmic * p,u32 reg,u32 * val)70316a51beSŁukasz Majewski int pmic_reg_read(struct pmic *p, u32 reg, u32 *val)
71316a51beSŁukasz Majewski {
72*505cf475SJaehoon Chung 	return pmic_reg(p, reg, val, 0);
73316a51beSŁukasz Majewski }
74