0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include "cxd2880_devio_spi.h"
0011
0012 #define BURST_WRITE_MAX 128
0013
0014 static int cxd2880_io_spi_read_reg(struct cxd2880_io *io,
0015 enum cxd2880_io_tgt tgt,
0016 u8 sub_address, u8 *data,
0017 u32 size)
0018 {
0019 int ret = 0;
0020 struct cxd2880_spi *spi = NULL;
0021 u8 send_data[6];
0022 u8 *read_data_top = data;
0023
0024 if (!io || !io->if_object || !data)
0025 return -EINVAL;
0026
0027 if (sub_address + size > 0x100)
0028 return -EINVAL;
0029
0030 spi = io->if_object;
0031
0032 if (tgt == CXD2880_IO_TGT_SYS)
0033 send_data[0] = 0x0b;
0034 else
0035 send_data[0] = 0x0a;
0036
0037 send_data[3] = 0;
0038 send_data[4] = 0;
0039 send_data[5] = 0;
0040
0041 while (size > 0) {
0042 send_data[1] = sub_address;
0043 if (size > 255)
0044 send_data[2] = 255;
0045 else
0046 send_data[2] = size;
0047
0048 ret =
0049 spi->write_read(spi, send_data, sizeof(send_data),
0050 read_data_top, send_data[2]);
0051 if (ret)
0052 return ret;
0053
0054 sub_address += send_data[2];
0055 read_data_top += send_data[2];
0056 size -= send_data[2];
0057 }
0058
0059 return ret;
0060 }
0061
0062 static int cxd2880_io_spi_write_reg(struct cxd2880_io *io,
0063 enum cxd2880_io_tgt tgt,
0064 u8 sub_address,
0065 const u8 *data, u32 size)
0066 {
0067 int ret = 0;
0068 struct cxd2880_spi *spi = NULL;
0069 u8 send_data[BURST_WRITE_MAX + 4];
0070 const u8 *write_data_top = data;
0071
0072 if (!io || !io->if_object || !data)
0073 return -EINVAL;
0074
0075 if (size > BURST_WRITE_MAX)
0076 return -EINVAL;
0077
0078 if (sub_address + size > 0x100)
0079 return -EINVAL;
0080
0081 spi = io->if_object;
0082
0083 if (tgt == CXD2880_IO_TGT_SYS)
0084 send_data[0] = 0x0f;
0085 else
0086 send_data[0] = 0x0e;
0087
0088 while (size > 0) {
0089 send_data[1] = sub_address;
0090 if (size > 255)
0091 send_data[2] = 255;
0092 else
0093 send_data[2] = size;
0094
0095 memcpy(&send_data[3], write_data_top, send_data[2]);
0096
0097 if (tgt == CXD2880_IO_TGT_SYS) {
0098 send_data[3 + send_data[2]] = 0x00;
0099 ret = spi->write(spi, send_data, send_data[2] + 4);
0100 } else {
0101 ret = spi->write(spi, send_data, send_data[2] + 3);
0102 }
0103 if (ret)
0104 return ret;
0105
0106 sub_address += send_data[2];
0107 write_data_top += send_data[2];
0108 size -= send_data[2];
0109 }
0110
0111 return ret;
0112 }
0113
0114 int cxd2880_io_spi_create(struct cxd2880_io *io,
0115 struct cxd2880_spi *spi, u8 slave_select)
0116 {
0117 if (!io || !spi)
0118 return -EINVAL;
0119
0120 io->read_regs = cxd2880_io_spi_read_reg;
0121 io->write_regs = cxd2880_io_spi_write_reg;
0122 io->write_reg = cxd2880_io_common_write_one_reg;
0123 io->if_object = spi;
0124 io->i2c_address_sys = 0;
0125 io->i2c_address_demod = 0;
0126 io->slave_select = slave_select;
0127
0128 return 0;
0129 }