Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 /*
0003  * cxd2880_io.c
0004  * Sony CXD2880 DVB-T2/T tuner + demodulator driver
0005  * register I/O interface functions
0006  *
0007  * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
0008  */
0009 
0010 #include "cxd2880_io.h"
0011 
0012 int cxd2880_io_common_write_one_reg(struct cxd2880_io *io,
0013                     enum cxd2880_io_tgt tgt,
0014                     u8 sub_address, u8 data)
0015 {
0016     if (!io)
0017         return -EINVAL;
0018 
0019     return io->write_regs(io, tgt, sub_address, &data, 1);
0020 }
0021 
0022 int cxd2880_io_set_reg_bits(struct cxd2880_io *io,
0023                 enum cxd2880_io_tgt tgt,
0024                 u8 sub_address, u8 data, u8 mask)
0025 {
0026     int ret;
0027 
0028     if (!io)
0029         return -EINVAL;
0030 
0031     if (mask == 0x00)
0032         return 0;
0033 
0034     if (mask != 0xff) {
0035         u8 rdata = 0x00;
0036 
0037         ret = io->read_regs(io, tgt, sub_address, &rdata, 1);
0038         if (ret)
0039             return ret;
0040 
0041         data = (data & mask) | (rdata & (mask ^ 0xff));
0042     }
0043 
0044     return io->write_reg(io, tgt, sub_address, data);
0045 }
0046 
0047 int cxd2880_io_write_multi_regs(struct cxd2880_io *io,
0048                  enum cxd2880_io_tgt tgt,
0049                  const struct cxd2880_reg_value reg_value[],
0050                  u8 size)
0051 {
0052     int ret;
0053     int i;
0054 
0055     if (!io)
0056         return -EINVAL;
0057 
0058     for (i = 0; i < size ; i++) {
0059         ret = io->write_reg(io, tgt, reg_value[i].addr,
0060                     reg_value[i].value);
0061         if (ret)
0062             return ret;
0063     }
0064 
0065     return 0;
0066 }