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