18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * cxd2880_io.c 48c2ecf20Sopenharmony_ci * Sony CXD2880 DVB-T2/T tuner + demodulator driver 58c2ecf20Sopenharmony_ci * register I/O interface functions 68c2ecf20Sopenharmony_ci * 78c2ecf20Sopenharmony_ci * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation 88c2ecf20Sopenharmony_ci */ 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include "cxd2880_io.h" 118c2ecf20Sopenharmony_ci 128c2ecf20Sopenharmony_ciint cxd2880_io_common_write_one_reg(struct cxd2880_io *io, 138c2ecf20Sopenharmony_ci enum cxd2880_io_tgt tgt, 148c2ecf20Sopenharmony_ci u8 sub_address, u8 data) 158c2ecf20Sopenharmony_ci{ 168c2ecf20Sopenharmony_ci if (!io) 178c2ecf20Sopenharmony_ci return -EINVAL; 188c2ecf20Sopenharmony_ci 198c2ecf20Sopenharmony_ci return io->write_regs(io, tgt, sub_address, &data, 1); 208c2ecf20Sopenharmony_ci} 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ciint cxd2880_io_set_reg_bits(struct cxd2880_io *io, 238c2ecf20Sopenharmony_ci enum cxd2880_io_tgt tgt, 248c2ecf20Sopenharmony_ci u8 sub_address, u8 data, u8 mask) 258c2ecf20Sopenharmony_ci{ 268c2ecf20Sopenharmony_ci int ret; 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci if (!io) 298c2ecf20Sopenharmony_ci return -EINVAL; 308c2ecf20Sopenharmony_ci 318c2ecf20Sopenharmony_ci if (mask == 0x00) 328c2ecf20Sopenharmony_ci return 0; 338c2ecf20Sopenharmony_ci 348c2ecf20Sopenharmony_ci if (mask != 0xff) { 358c2ecf20Sopenharmony_ci u8 rdata = 0x00; 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci ret = io->read_regs(io, tgt, sub_address, &rdata, 1); 388c2ecf20Sopenharmony_ci if (ret) 398c2ecf20Sopenharmony_ci return ret; 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci data = (data & mask) | (rdata & (mask ^ 0xff)); 428c2ecf20Sopenharmony_ci } 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci return io->write_reg(io, tgt, sub_address, data); 458c2ecf20Sopenharmony_ci} 468c2ecf20Sopenharmony_ci 478c2ecf20Sopenharmony_ciint cxd2880_io_write_multi_regs(struct cxd2880_io *io, 488c2ecf20Sopenharmony_ci enum cxd2880_io_tgt tgt, 498c2ecf20Sopenharmony_ci const struct cxd2880_reg_value reg_value[], 508c2ecf20Sopenharmony_ci u8 size) 518c2ecf20Sopenharmony_ci{ 528c2ecf20Sopenharmony_ci int ret; 538c2ecf20Sopenharmony_ci int i; 548c2ecf20Sopenharmony_ci 558c2ecf20Sopenharmony_ci if (!io) 568c2ecf20Sopenharmony_ci return -EINVAL; 578c2ecf20Sopenharmony_ci 588c2ecf20Sopenharmony_ci for (i = 0; i < size ; i++) { 598c2ecf20Sopenharmony_ci ret = io->write_reg(io, tgt, reg_value[i].addr, 608c2ecf20Sopenharmony_ci reg_value[i].value); 618c2ecf20Sopenharmony_ci if (ret) 628c2ecf20Sopenharmony_ci return ret; 638c2ecf20Sopenharmony_ci } 648c2ecf20Sopenharmony_ci 658c2ecf20Sopenharmony_ci return 0; 668c2ecf20Sopenharmony_ci} 67