media: cxd2880: Add common files for the driver
These are common files for the driver for the Sony CXD2880 DVB-T2/T tuner + demodulator. These contains helper functions for the driver. Signed-off-by: Yasunari Takiguchi <Yasunari.Takiguchi@sony.com> Signed-off-by: Masayuki Yamamoto <Masayuki.Yamamoto@sony.com> Signed-off-by: Hideki Nozawa <Hideki.Nozawa@sony.com> Signed-off-by: Kota Yonezawa <Kota.Yonezawa@sony.com> Signed-off-by: Toshihiko Matsumoto <Toshihiko.Matsumoto@sony.com> Signed-off-by: Satoshi Watanabe <Satoshi.C.Watanabe@sony.com> Signed-off-by: Mauro Carvalho Chehab <mchehab@s-opensource.com>
This commit is contained in:
		
							parent
							
								
									bd24fcddf6
								
							
						
					
					
						commit
						1a3ef038d0
					
				
							
								
								
									
										29
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,29 @@
 | 
			
		||||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
/*
 | 
			
		||||
 * cxd2880.h
 | 
			
		||||
 * Sony CXD2880 DVB-T2/T tuner + demodulator driver public definitions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CXD2880_H
 | 
			
		||||
#define CXD2880_H
 | 
			
		||||
 | 
			
		||||
struct cxd2880_config {
 | 
			
		||||
	struct spi_device *spi;
 | 
			
		||||
	struct mutex *spi_mutex; /* For SPI access exclusive control */
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#if IS_REACHABLE(CONFIG_DVB_CXD2880)
 | 
			
		||||
extern struct dvb_frontend *cxd2880_attach(struct dvb_frontend *fe,
 | 
			
		||||
					struct cxd2880_config *cfg);
 | 
			
		||||
#else
 | 
			
		||||
static inline struct dvb_frontend *cxd2880_attach(struct dvb_frontend *fe,
 | 
			
		||||
					struct cxd2880_config *cfg)
 | 
			
		||||
{
 | 
			
		||||
	pr_warn("%s: driver disabled by Kconfig\n", __func__);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
#endif /* CONFIG_DVB_CXD2880 */
 | 
			
		||||
 | 
			
		||||
#endif /* CXD2880_H */
 | 
			
		||||
							
								
								
									
										21
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_common.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_common.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,21 @@
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
/*
 | 
			
		||||
 * cxd2880_common.c
 | 
			
		||||
 * Sony CXD2880 DVB-T2/T tuner + demodulator driver
 | 
			
		||||
 * common functions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "cxd2880_common.h"
 | 
			
		||||
 | 
			
		||||
int cxd2880_convert2s_complement(u32 value, u32 bitlen)
 | 
			
		||||
{
 | 
			
		||||
	if (!bitlen || bitlen >= 32)
 | 
			
		||||
		return (int)value;
 | 
			
		||||
 | 
			
		||||
	if (value & (u32)(1 << (bitlen - 1)))
 | 
			
		||||
		return (int)(GENMASK(31, bitlen) | value);
 | 
			
		||||
	else
 | 
			
		||||
		return (int)(GENMASK(bitlen - 1, 0) & value);
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										19
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_common.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_common.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,19 @@
 | 
			
		||||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
/*
 | 
			
		||||
 * cxd2880_common.h
 | 
			
		||||
 * Sony CXD2880 DVB-T2/T tuner + demodulator driver common definitions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CXD2880_COMMON_H
 | 
			
		||||
#define CXD2880_COMMON_H
 | 
			
		||||
 | 
			
		||||
#include <linux/types.h>
 | 
			
		||||
#include <linux/errno.h>
 | 
			
		||||
#include <linux/delay.h>
 | 
			
		||||
#include <linux/string.h>
 | 
			
		||||
 | 
			
		||||
int cxd2880_convert2s_complement(u32 value, u32 bitlen);
 | 
			
		||||
 | 
			
		||||
#endif
 | 
			
		||||
							
								
								
									
										66
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_io.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										66
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_io.c
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,66 @@
 | 
			
		||||
// SPDX-License-Identifier: GPL-2.0
 | 
			
		||||
/*
 | 
			
		||||
 * cxd2880_io.c
 | 
			
		||||
 * Sony CXD2880 DVB-T2/T tuner + demodulator driver
 | 
			
		||||
 * register I/O interface functions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#include "cxd2880_io.h"
 | 
			
		||||
 | 
			
		||||
int cxd2880_io_common_write_one_reg(struct cxd2880_io *io,
 | 
			
		||||
				    enum cxd2880_io_tgt tgt,
 | 
			
		||||
				    u8 sub_address, u8 data)
 | 
			
		||||
{
 | 
			
		||||
	if (!io)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	return io->write_regs(io, tgt, sub_address, &data, 1);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cxd2880_io_set_reg_bits(struct cxd2880_io *io,
 | 
			
		||||
			    enum cxd2880_io_tgt tgt,
 | 
			
		||||
			    u8 sub_address, u8 data, u8 mask)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
 | 
			
		||||
	if (!io)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	if (mask == 0x00)
 | 
			
		||||
		return 0;
 | 
			
		||||
 | 
			
		||||
	if (mask != 0xff) {
 | 
			
		||||
		u8 rdata = 0x00;
 | 
			
		||||
 | 
			
		||||
		ret = io->read_regs(io, tgt, sub_address, &rdata, 1);
 | 
			
		||||
		if (ret)
 | 
			
		||||
			return ret;
 | 
			
		||||
 | 
			
		||||
		data = (data & mask) | (rdata & (mask ^ 0xff));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return io->write_reg(io, tgt, sub_address, data);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int cxd2880_io_write_multi_regs(struct cxd2880_io *io,
 | 
			
		||||
			     enum cxd2880_io_tgt tgt,
 | 
			
		||||
			     const struct cxd2880_reg_value reg_value[],
 | 
			
		||||
			     u8 size)
 | 
			
		||||
{
 | 
			
		||||
	int ret;
 | 
			
		||||
	int i;
 | 
			
		||||
 | 
			
		||||
	if (!io)
 | 
			
		||||
		return -EINVAL;
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < size ; i++) {
 | 
			
		||||
		ret = io->write_reg(io, tgt, reg_value[i].addr,
 | 
			
		||||
				    reg_value[i].value);
 | 
			
		||||
		if (ret)
 | 
			
		||||
			return ret;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return 0;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										54
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_io.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								drivers/media/dvb-frontends/cxd2880/cxd2880_io.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,54 @@
 | 
			
		||||
/* SPDX-License-Identifier: GPL-2.0 */
 | 
			
		||||
/*
 | 
			
		||||
 * cxd2880_io.h
 | 
			
		||||
 * Sony CXD2880 DVB-T2/T tuner + demodulator driver
 | 
			
		||||
 * register I/O interface definitions
 | 
			
		||||
 *
 | 
			
		||||
 * Copyright (C) 2016, 2017, 2018 Sony Semiconductor Solutions Corporation
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
#ifndef CXD2880_IO_H
 | 
			
		||||
#define CXD2880_IO_H
 | 
			
		||||
 | 
			
		||||
#include "cxd2880_common.h"
 | 
			
		||||
 | 
			
		||||
enum cxd2880_io_tgt {
 | 
			
		||||
	CXD2880_IO_TGT_SYS,
 | 
			
		||||
	CXD2880_IO_TGT_DMD
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct cxd2880_reg_value {
 | 
			
		||||
	u8 addr;
 | 
			
		||||
	u8 value;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
struct cxd2880_io {
 | 
			
		||||
	int (*read_regs)(struct cxd2880_io *io,
 | 
			
		||||
			 enum cxd2880_io_tgt tgt, u8 sub_address,
 | 
			
		||||
			 u8 *data, u32 size);
 | 
			
		||||
	int (*write_regs)(struct cxd2880_io *io,
 | 
			
		||||
			  enum cxd2880_io_tgt tgt, u8 sub_address,
 | 
			
		||||
			  const u8 *data, u32 size);
 | 
			
		||||
	int (*write_reg)(struct cxd2880_io *io,
 | 
			
		||||
			 enum cxd2880_io_tgt tgt, u8 sub_address,
 | 
			
		||||
			 u8 data);
 | 
			
		||||
	void *if_object;
 | 
			
		||||
	u8 i2c_address_sys;
 | 
			
		||||
	u8 i2c_address_demod;
 | 
			
		||||
	u8 slave_select;
 | 
			
		||||
	void *user;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
int cxd2880_io_common_write_one_reg(struct cxd2880_io *io,
 | 
			
		||||
				    enum cxd2880_io_tgt tgt,
 | 
			
		||||
				    u8 sub_address, u8 data);
 | 
			
		||||
 | 
			
		||||
int cxd2880_io_set_reg_bits(struct cxd2880_io *io,
 | 
			
		||||
			    enum cxd2880_io_tgt tgt,
 | 
			
		||||
			    u8 sub_address, u8 data, u8 mask);
 | 
			
		||||
 | 
			
		||||
int cxd2880_io_write_multi_regs(struct cxd2880_io *io,
 | 
			
		||||
				enum cxd2880_io_tgt tgt,
 | 
			
		||||
				const struct cxd2880_reg_value reg_value[],
 | 
			
		||||
				u8 size);
 | 
			
		||||
#endif
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user