]>
Commit | Line | Data |
---|---|---|
e542b7f0 ŁM |
1 | /* |
2 | * Copyright (C) 2011 Samsung Electronics | |
3 | * Lukasz Majewski <[email protected]> | |
4 | * | |
5 | * (C) Copyright 2010 | |
6 | * Stefano Babic, DENX Software Engineering, [email protected] | |
7 | * | |
8 | * (C) Copyright 2008-2009 Freescale Semiconductor, Inc. | |
9 | * | |
1a459660 | 10 | * SPDX-License-Identifier: GPL-2.0+ |
e542b7f0 ŁM |
11 | */ |
12 | ||
13 | #include <common.h> | |
14 | #include <linux/types.h> | |
c7336815 | 15 | #include <power/pmic.h> |
e542b7f0 | 16 | #include <i2c.h> |
86879d71 | 17 | #include <compiler.h> |
e542b7f0 ŁM |
18 | |
19 | int pmic_reg_write(struct pmic *p, u32 reg, u32 val) | |
20 | { | |
21 | unsigned char buf[4] = { 0 }; | |
22 | ||
c7336815 | 23 | if (check_reg(p, reg)) |
e542b7f0 ŁM |
24 | return -1; |
25 | ||
0b259dc2 AD |
26 | I2C_SET_BUS(p->bus); |
27 | ||
e542b7f0 ŁM |
28 | switch (pmic_i2c_tx_num) { |
29 | case 3: | |
86879d71 ŁM |
30 | if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) { |
31 | buf[2] = (cpu_to_le32(val) >> 16) & 0xff; | |
32 | buf[1] = (cpu_to_le32(val) >> 8) & 0xff; | |
33 | buf[0] = cpu_to_le32(val) & 0xff; | |
34 | } else { | |
35 | buf[0] = (cpu_to_le32(val) >> 16) & 0xff; | |
36 | buf[1] = (cpu_to_le32(val) >> 8) & 0xff; | |
37 | buf[2] = cpu_to_le32(val) & 0xff; | |
38 | } | |
e542b7f0 | 39 | break; |
b5bf9caf | 40 | case 2: |
86879d71 ŁM |
41 | if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) { |
42 | buf[1] = (cpu_to_le32(val) >> 8) & 0xff; | |
43 | buf[0] = cpu_to_le32(val) & 0xff; | |
44 | } else { | |
45 | buf[0] = (cpu_to_le32(val) >> 8) & 0xff; | |
46 | buf[1] = cpu_to_le32(val) & 0xff; | |
47 | } | |
b5bf9caf | 48 | break; |
e542b7f0 | 49 | case 1: |
86879d71 | 50 | buf[0] = cpu_to_le32(val) & 0xff; |
e542b7f0 | 51 | break; |
a22429d2 FE |
52 | default: |
53 | printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); | |
54 | return -1; | |
e542b7f0 ŁM |
55 | } |
56 | ||
57 | if (i2c_write(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) | |
58 | return -1; | |
59 | ||
60 | return 0; | |
61 | } | |
62 | ||
63 | int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) | |
64 | { | |
65 | unsigned char buf[4] = { 0 }; | |
66 | u32 ret_val = 0; | |
67 | ||
c7336815 | 68 | if (check_reg(p, reg)) |
e542b7f0 ŁM |
69 | return -1; |
70 | ||
0b259dc2 AD |
71 | I2C_SET_BUS(p->bus); |
72 | ||
e542b7f0 ŁM |
73 | if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) |
74 | return -1; | |
75 | ||
76 | switch (pmic_i2c_tx_num) { | |
77 | case 3: | |
86879d71 ŁM |
78 | if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) |
79 | ret_val = le32_to_cpu(buf[2] << 16 | |
80 | | buf[1] << 8 | buf[0]); | |
81 | else | |
82 | ret_val = le32_to_cpu(buf[0] << 16 | | |
83 | buf[1] << 8 | buf[2]); | |
e542b7f0 | 84 | break; |
b5bf9caf | 85 | case 2: |
86879d71 ŁM |
86 | if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) |
87 | ret_val = le32_to_cpu(buf[1] << 8 | buf[0]); | |
88 | else | |
89 | ret_val = le32_to_cpu(buf[0] << 8 | buf[1]); | |
b5bf9caf | 90 | break; |
e542b7f0 | 91 | case 1: |
86879d71 | 92 | ret_val = le32_to_cpu(buf[0]); |
e542b7f0 | 93 | break; |
a22429d2 FE |
94 | default: |
95 | printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); | |
96 | return -1; | |
e542b7f0 ŁM |
97 | } |
98 | memcpy(val, &ret_val, sizeof(ret_val)); | |
99 | ||
100 | return 0; | |
101 | } | |
102 | ||
103 | int pmic_probe(struct pmic *p) | |
104 | { | |
3fbb517f | 105 | i2c_set_bus_num(p->bus); |
b5bf9caf | 106 | debug("Bus: %d PMIC:%s probed!\n", p->bus, p->name); |
e542b7f0 ŁM |
107 | if (i2c_probe(pmic_i2c_addr)) { |
108 | printf("Can't find PMIC:%s\n", p->name); | |
109 | return -1; | |
110 | } | |
111 | ||
112 | return 0; | |
113 | } |