18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-only */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * TI/National Semiconductor LP3943 Device
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Copyright 2013 Texas Instruments
68c2ecf20Sopenharmony_ci *
78c2ecf20Sopenharmony_ci * Author: Milo Kim <milo.kim@ti.com>
88c2ecf20Sopenharmony_ci */
98c2ecf20Sopenharmony_ci
108c2ecf20Sopenharmony_ci#ifndef __MFD_LP3943_H__
118c2ecf20Sopenharmony_ci#define __MFD_LP3943_H__
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_ci#include <linux/gpio.h>
148c2ecf20Sopenharmony_ci#include <linux/pwm.h>
158c2ecf20Sopenharmony_ci#include <linux/regmap.h>
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci/* Registers */
188c2ecf20Sopenharmony_ci#define LP3943_REG_GPIO_A		0x00
198c2ecf20Sopenharmony_ci#define LP3943_REG_GPIO_B		0x01
208c2ecf20Sopenharmony_ci#define LP3943_REG_PRESCALE0		0x02
218c2ecf20Sopenharmony_ci#define LP3943_REG_PWM0			0x03
228c2ecf20Sopenharmony_ci#define LP3943_REG_PRESCALE1		0x04
238c2ecf20Sopenharmony_ci#define LP3943_REG_PWM1			0x05
248c2ecf20Sopenharmony_ci#define LP3943_REG_MUX0			0x06
258c2ecf20Sopenharmony_ci#define LP3943_REG_MUX1			0x07
268c2ecf20Sopenharmony_ci#define LP3943_REG_MUX2			0x08
278c2ecf20Sopenharmony_ci#define LP3943_REG_MUX3			0x09
288c2ecf20Sopenharmony_ci
298c2ecf20Sopenharmony_ci/* Bit description for LP3943_REG_MUX0 ~ 3 */
308c2ecf20Sopenharmony_ci#define LP3943_GPIO_IN			0x00
318c2ecf20Sopenharmony_ci#define LP3943_GPIO_OUT_HIGH		0x00
328c2ecf20Sopenharmony_ci#define LP3943_GPIO_OUT_LOW		0x01
338c2ecf20Sopenharmony_ci#define LP3943_DIM_PWM0			0x02
348c2ecf20Sopenharmony_ci#define LP3943_DIM_PWM1			0x03
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define LP3943_NUM_PWMS			2
378c2ecf20Sopenharmony_ci
388c2ecf20Sopenharmony_cienum lp3943_pwm_output {
398c2ecf20Sopenharmony_ci	LP3943_PWM_OUT0,
408c2ecf20Sopenharmony_ci	LP3943_PWM_OUT1,
418c2ecf20Sopenharmony_ci	LP3943_PWM_OUT2,
428c2ecf20Sopenharmony_ci	LP3943_PWM_OUT3,
438c2ecf20Sopenharmony_ci	LP3943_PWM_OUT4,
448c2ecf20Sopenharmony_ci	LP3943_PWM_OUT5,
458c2ecf20Sopenharmony_ci	LP3943_PWM_OUT6,
468c2ecf20Sopenharmony_ci	LP3943_PWM_OUT7,
478c2ecf20Sopenharmony_ci	LP3943_PWM_OUT8,
488c2ecf20Sopenharmony_ci	LP3943_PWM_OUT9,
498c2ecf20Sopenharmony_ci	LP3943_PWM_OUT10,
508c2ecf20Sopenharmony_ci	LP3943_PWM_OUT11,
518c2ecf20Sopenharmony_ci	LP3943_PWM_OUT12,
528c2ecf20Sopenharmony_ci	LP3943_PWM_OUT13,
538c2ecf20Sopenharmony_ci	LP3943_PWM_OUT14,
548c2ecf20Sopenharmony_ci	LP3943_PWM_OUT15,
558c2ecf20Sopenharmony_ci};
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_ci/*
588c2ecf20Sopenharmony_ci * struct lp3943_pwm_map
598c2ecf20Sopenharmony_ci * @output: Output pins which are mapped to each PWM channel
608c2ecf20Sopenharmony_ci * @num_outputs: Number of outputs
618c2ecf20Sopenharmony_ci */
628c2ecf20Sopenharmony_cistruct lp3943_pwm_map {
638c2ecf20Sopenharmony_ci	enum lp3943_pwm_output *output;
648c2ecf20Sopenharmony_ci	int num_outputs;
658c2ecf20Sopenharmony_ci};
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_ci/*
688c2ecf20Sopenharmony_ci * struct lp3943_platform_data
698c2ecf20Sopenharmony_ci * @pwms: Output channel definitions for PWM channel 0 and 1
708c2ecf20Sopenharmony_ci */
718c2ecf20Sopenharmony_cistruct lp3943_platform_data {
728c2ecf20Sopenharmony_ci	struct lp3943_pwm_map *pwms[LP3943_NUM_PWMS];
738c2ecf20Sopenharmony_ci};
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci/*
768c2ecf20Sopenharmony_ci * struct lp3943_reg_cfg
778c2ecf20Sopenharmony_ci * @reg: Register address
788c2ecf20Sopenharmony_ci * @mask: Register bit mask to be updated
798c2ecf20Sopenharmony_ci * @shift: Register bit shift
808c2ecf20Sopenharmony_ci */
818c2ecf20Sopenharmony_cistruct lp3943_reg_cfg {
828c2ecf20Sopenharmony_ci	u8 reg;
838c2ecf20Sopenharmony_ci	u8 mask;
848c2ecf20Sopenharmony_ci	u8 shift;
858c2ecf20Sopenharmony_ci};
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci/*
888c2ecf20Sopenharmony_ci * struct lp3943
898c2ecf20Sopenharmony_ci * @dev: Parent device pointer
908c2ecf20Sopenharmony_ci * @regmap: Used for I2C communication on accessing registers
918c2ecf20Sopenharmony_ci * @pdata: LP3943 platform specific data
928c2ecf20Sopenharmony_ci * @mux_cfg: Register configuration for pin MUX
938c2ecf20Sopenharmony_ci * @pin_used: Bit mask for output pin used.
948c2ecf20Sopenharmony_ci *	      This bitmask is used for pin assignment management.
958c2ecf20Sopenharmony_ci *	      1 = pin used, 0 = available.
968c2ecf20Sopenharmony_ci *	      Only LSB 16 bits are used, but it is unsigned long type
978c2ecf20Sopenharmony_ci *	      for atomic bitwise operations.
988c2ecf20Sopenharmony_ci */
998c2ecf20Sopenharmony_cistruct lp3943 {
1008c2ecf20Sopenharmony_ci	struct device *dev;
1018c2ecf20Sopenharmony_ci	struct regmap *regmap;
1028c2ecf20Sopenharmony_ci	struct lp3943_platform_data *pdata;
1038c2ecf20Sopenharmony_ci	const struct lp3943_reg_cfg *mux_cfg;
1048c2ecf20Sopenharmony_ci	unsigned long pin_used;
1058c2ecf20Sopenharmony_ci};
1068c2ecf20Sopenharmony_ci
1078c2ecf20Sopenharmony_ciint lp3943_read_byte(struct lp3943 *lp3943, u8 reg, u8 *read);
1088c2ecf20Sopenharmony_ciint lp3943_write_byte(struct lp3943 *lp3943, u8 reg, u8 data);
1098c2ecf20Sopenharmony_ciint lp3943_update_bits(struct lp3943 *lp3943, u8 reg, u8 mask, u8 data);
1108c2ecf20Sopenharmony_ci#endif
111