2 * Copyright (C) 2015 Samsung Electronics
3 * Przemyslaw Marczak <p.marczak@samsung.com>
5 * SPDX-License-Identifier: GPL-2.0+
12 #include <power/pmic.h>
13 #include <power/sandbox_pmic.h>
15 DECLARE_GLOBAL_DATA_PTR
;
18 * struct sandbox_i2c_pmic_plat_data - platform data for the PMIC
20 * @rw_reg: PMICs register of the chip I/O transaction
21 * @reg: PMICs registers array
23 struct sandbox_i2c_pmic_plat_data
{
25 u8 reg
[SANDBOX_PMIC_REG_COUNT
];
28 static int sandbox_i2c_pmic_read_data(struct udevice
*emul
, uchar chip
,
29 uchar
*buffer
, int len
)
31 struct sandbox_i2c_pmic_plat_data
*plat
= dev_get_platdata(emul
);
33 if (plat
->rw_reg
+ len
> SANDBOX_PMIC_REG_COUNT
) {
34 pr_err("Request exceeds PMIC register range! Max register: %#x",
35 SANDBOX_PMIC_REG_COUNT
);
39 debug("Read PMIC: %#x at register: %#x count: %d\n",
40 (unsigned)chip
& 0xff, plat
->rw_reg
, len
);
42 memcpy(buffer
, &plat
->reg
[plat
->rw_reg
], len
);
47 static int sandbox_i2c_pmic_write_data(struct udevice
*emul
, uchar chip
,
48 uchar
*buffer
, int len
,
51 struct sandbox_i2c_pmic_plat_data
*plat
= dev_get_platdata(emul
);
57 /* Set PMIC register for I/O */
58 plat
->rw_reg
= *buffer
;
60 debug("Write PMIC: %#x at register: %#x count: %d\n",
61 (unsigned)chip
& 0xff, plat
->rw_reg
, len
);
63 /* For read operation, set (write) only chip reg */
70 if (plat
->rw_reg
+ len
> SANDBOX_PMIC_REG_COUNT
) {
71 pr_err("Request exceeds PMIC register range! Max register: %#x",
72 SANDBOX_PMIC_REG_COUNT
);
75 memcpy(&plat
->reg
[plat
->rw_reg
], buffer
, len
);
80 static int sandbox_i2c_pmic_xfer(struct udevice
*emul
, struct i2c_msg
*msg
,
85 for (; nmsgs
> 0; nmsgs
--, msg
++) {
86 bool next_is_read
= nmsgs
> 1 && (msg
[1].flags
& I2C_M_RD
);
87 if (msg
->flags
& I2C_M_RD
) {
88 ret
= sandbox_i2c_pmic_read_data(emul
, msg
->addr
,
91 ret
= sandbox_i2c_pmic_write_data(emul
, msg
->addr
,
103 static int sandbox_i2c_pmic_ofdata_to_platdata(struct udevice
*emul
)
105 struct sandbox_i2c_pmic_plat_data
*plat
= dev_get_platdata(emul
);
106 const u8
*reg_defaults
;
108 debug("%s:%d Setting PMIC default registers\n", __func__
, __LINE__
);
110 reg_defaults
= dev_read_u8_array_ptr(emul
, "reg-defaults",
111 SANDBOX_PMIC_REG_COUNT
);
114 pr_err("Property \"reg-defaults\" not found for device: %s!",
119 memcpy(&plat
->reg
, reg_defaults
, SANDBOX_PMIC_REG_COUNT
);
124 struct dm_i2c_ops sandbox_i2c_pmic_emul_ops
= {
125 .xfer
= sandbox_i2c_pmic_xfer
,
128 static const struct udevice_id sandbox_i2c_pmic_ids
[] = {
129 { .compatible
= "sandbox,i2c-pmic" },
133 U_BOOT_DRIVER(sandbox_i2c_pmic_emul
) = {
134 .name
= "sandbox_i2c_pmic_emul",
135 .id
= UCLASS_I2C_EMUL
,
136 .of_match
= sandbox_i2c_pmic_ids
,
137 .ofdata_to_platdata
= sandbox_i2c_pmic_ofdata_to_platdata
,
138 .platdata_auto_alloc_size
= sizeof(struct sandbox_i2c_pmic_plat_data
),
139 .ops
= &sandbox_i2c_pmic_emul_ops
,