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 <i2c.h> 17316a51beSŁukasz Majewski #include <compiler.h> 18316a51beSŁukasz Majewski 19316a51beSŁukasz Majewski int pmic_reg_write(struct pmic *p, u32 reg, u32 val) 20316a51beSŁukasz Majewski { 21316a51beSŁukasz Majewski unsigned char buf[4] = { 0 }; 22316a51beSŁukasz Majewski 23316a51beSŁukasz Majewski if (check_reg(p, reg)) 24316a51beSŁukasz Majewski return -1; 25316a51beSŁukasz Majewski 26*0b259dc2SAaron Durbin I2C_SET_BUS(p->bus); 27*0b259dc2SAaron Durbin 28316a51beSŁukasz Majewski switch (pmic_i2c_tx_num) { 29316a51beSŁukasz Majewski case 3: 30316a51beSŁukasz Majewski if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) { 31316a51beSŁukasz Majewski buf[2] = (cpu_to_le32(val) >> 16) & 0xff; 32316a51beSŁukasz Majewski buf[1] = (cpu_to_le32(val) >> 8) & 0xff; 33316a51beSŁukasz Majewski buf[0] = cpu_to_le32(val) & 0xff; 34316a51beSŁukasz Majewski } else { 35316a51beSŁukasz Majewski buf[0] = (cpu_to_le32(val) >> 16) & 0xff; 36316a51beSŁukasz Majewski buf[1] = (cpu_to_le32(val) >> 8) & 0xff; 37316a51beSŁukasz Majewski buf[2] = cpu_to_le32(val) & 0xff; 38316a51beSŁukasz Majewski } 39316a51beSŁukasz Majewski break; 40316a51beSŁukasz Majewski case 2: 41316a51beSŁukasz Majewski if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) { 42316a51beSŁukasz Majewski buf[1] = (cpu_to_le32(val) >> 8) & 0xff; 43316a51beSŁukasz Majewski buf[0] = cpu_to_le32(val) & 0xff; 44316a51beSŁukasz Majewski } else { 45316a51beSŁukasz Majewski buf[0] = (cpu_to_le32(val) >> 8) & 0xff; 46316a51beSŁukasz Majewski buf[1] = cpu_to_le32(val) & 0xff; 47316a51beSŁukasz Majewski } 48316a51beSŁukasz Majewski break; 49316a51beSŁukasz Majewski case 1: 50316a51beSŁukasz Majewski buf[0] = cpu_to_le32(val) & 0xff; 51316a51beSŁukasz Majewski break; 52316a51beSŁukasz Majewski default: 53316a51beSŁukasz Majewski printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); 54316a51beSŁukasz Majewski return -1; 55316a51beSŁukasz Majewski } 56316a51beSŁukasz Majewski 57316a51beSŁukasz Majewski if (i2c_write(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) 58316a51beSŁukasz Majewski return -1; 59316a51beSŁukasz Majewski 60316a51beSŁukasz Majewski return 0; 61316a51beSŁukasz Majewski } 62316a51beSŁukasz Majewski 63316a51beSŁukasz Majewski int pmic_reg_read(struct pmic *p, u32 reg, u32 *val) 64316a51beSŁukasz Majewski { 65316a51beSŁukasz Majewski unsigned char buf[4] = { 0 }; 66316a51beSŁukasz Majewski u32 ret_val = 0; 67316a51beSŁukasz Majewski 68316a51beSŁukasz Majewski if (check_reg(p, reg)) 69316a51beSŁukasz Majewski return -1; 70316a51beSŁukasz Majewski 71*0b259dc2SAaron Durbin I2C_SET_BUS(p->bus); 72*0b259dc2SAaron Durbin 73316a51beSŁukasz Majewski if (i2c_read(pmic_i2c_addr, reg, 1, buf, pmic_i2c_tx_num)) 74316a51beSŁukasz Majewski return -1; 75316a51beSŁukasz Majewski 76316a51beSŁukasz Majewski switch (pmic_i2c_tx_num) { 77316a51beSŁukasz Majewski case 3: 78316a51beSŁukasz Majewski if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) 79316a51beSŁukasz Majewski ret_val = le32_to_cpu(buf[2] << 16 80316a51beSŁukasz Majewski | buf[1] << 8 | buf[0]); 81316a51beSŁukasz Majewski else 82316a51beSŁukasz Majewski ret_val = le32_to_cpu(buf[0] << 16 | 83316a51beSŁukasz Majewski buf[1] << 8 | buf[2]); 84316a51beSŁukasz Majewski break; 85316a51beSŁukasz Majewski case 2: 86316a51beSŁukasz Majewski if (p->sensor_byte_order == PMIC_SENSOR_BYTE_ORDER_BIG) 87316a51beSŁukasz Majewski ret_val = le32_to_cpu(buf[1] << 8 | buf[0]); 88316a51beSŁukasz Majewski else 89316a51beSŁukasz Majewski ret_val = le32_to_cpu(buf[0] << 8 | buf[1]); 90316a51beSŁukasz Majewski break; 91316a51beSŁukasz Majewski case 1: 92316a51beSŁukasz Majewski ret_val = le32_to_cpu(buf[0]); 93316a51beSŁukasz Majewski break; 94316a51beSŁukasz Majewski default: 95316a51beSŁukasz Majewski printf("%s: invalid tx_num: %d", __func__, pmic_i2c_tx_num); 96316a51beSŁukasz Majewski return -1; 97316a51beSŁukasz Majewski } 98316a51beSŁukasz Majewski memcpy(val, &ret_val, sizeof(ret_val)); 99316a51beSŁukasz Majewski 100316a51beSŁukasz Majewski return 0; 101316a51beSŁukasz Majewski } 102316a51beSŁukasz Majewski 103316a51beSŁukasz Majewski int pmic_probe(struct pmic *p) 104316a51beSŁukasz Majewski { 1053fbb517fSŁukasz Majewski i2c_set_bus_num(p->bus); 106316a51beSŁukasz Majewski debug("Bus: %d PMIC:%s probed!\n", p->bus, p->name); 107316a51beSŁukasz Majewski if (i2c_probe(pmic_i2c_addr)) { 108316a51beSŁukasz Majewski printf("Can't find PMIC:%s\n", p->name); 109316a51beSŁukasz Majewski return -1; 110316a51beSŁukasz Majewski } 111316a51beSŁukasz Majewski 112316a51beSŁukasz Majewski return 0; 113316a51beSŁukasz Majewski } 114