Commit 1a3ef038 authored by Yasunari Takiguchi's avatar Yasunari Takiguchi Committed by Mauro Carvalho Chehab
Browse files

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: default avatarYasunari Takiguchi <Yasunari.Takiguchi@sony.com>
Signed-off-by: default avatarMasayuki Yamamoto <Masayuki.Yamamoto@sony.com>
Signed-off-by: default avatarHideki Nozawa <Hideki.Nozawa@sony.com>
Signed-off-by: default avatarKota Yonezawa <Kota.Yonezawa@sony.com>
Signed-off-by: default avatarToshihiko Matsumoto <Toshihiko.Matsumoto@sony.com>
Signed-off-by: default avatarSatoshi Watanabe <Satoshi.C.Watanabe@sony.com>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab@s-opensource.com>
parent bd24fcdd
Loading
Loading
Loading
Loading
+29 −0
Original line number Diff line number Diff line
/* 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 −0
Original line number Diff line number Diff line
// 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 −0
Original line number Diff line number Diff line
/* 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 −0
Original line number Diff line number Diff line
// 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 −0
Original line number Diff line number Diff line
/* 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