/* SPDX-License-Identifier: (GPL-2.0+ OR MIT) */ /* * Copyright (c) 2023 Rockchip Electronics Co., Ltd. */ #ifndef _PWM_ROCKCHIP_H_ #define _PWM_ROCKCHIP_H_ #include /** * enum rockchip_pwm_global_ctrl_cmd - commands for pwm global ctrl * @PWM_GLOBAL_CTRL_JOIN: join the global control group * @PWM_GLOBAL_CTRL_EXIT: exit the global control group * @PWM_GLOBAL_CTRL_GRANT: obtian the permission of global control * @PWM_GLOBAL_CTRL_RECLAIM: reclaim the permission of global control * @PWM_GLOBAL_CTRL_UPDATE: update the configs for all channels in group * @PWM_GLOBAL_CTRL_ENABLE: enable all channels in group * @PWM_GLOBAL_CTRL_DISABLE: disable all channels in group */ enum rockchip_pwm_global_ctrl_cmd { PWM_GLOBAL_CTRL_JOIN, PWM_GLOBAL_CTRL_EXIT, PWM_GLOBAL_CTRL_GRANT, PWM_GLOBAL_CTRL_RECLAIM, PWM_GLOBAL_CTRL_UPDATE, PWM_GLOBAL_CTRL_ENABLE, PWM_GLOBAL_CTRL_DISABLE, }; /** * struct rockchip_pwm_wave_table - wave table config object * @offset: the offset of wave table to set * @len: the length of wave table to set * @table: the values of wave table to set * @ */ struct rockchip_pwm_wave_table { u16 offset; u16 len; u64 *table; }; /** * enum rockchip_pwm_wave_table_width_mode - element width of pwm wave table * @PWM_WAVE_TABLE_8BITS_WIDTH: each element in table is 8bits * @PWM_WAVE_TABLE_16BITS_WIDTH: each element in table is 16bits */ enum rockchip_pwm_wave_table_width_mode { PWM_WAVE_TABLE_8BITS_WIDTH, PWM_WAVE_TABLE_16BITS_WIDTH, }; /** * enum rockchip_pwm_wave_update_mode - update mode of wave generator * @PWM_WAVE_INCREASING: * The wave table address will wrap back to minimum address when increase to * maximum and then increase again. * @PWM_WAVE_INCREASING_THEN_DECREASING: * The wave table address will change to decreasing when increasing to the maximum * address. it will return to increasing when decrease to the minimum value. */ enum rockchip_pwm_wave_update_mode { PWM_WAVE_INCREASING, PWM_WAVE_INCREASING_THEN_DECREASING, }; /** * struct rockchip_pwm_wave_config - wave generator config object * @duty_table: the wave table config of duty * @period_table: the wave table config of period * @enable: enable or disable wave generator * @duty_en: to update duty by duty table or not * @period_en: to update period by period table or not * @width_mode: the width mode of wave table * @update_mode: the update mode of wave generator * @duty_max: the maximum address of duty table * @duty_min: the minimum address of duty table * @period_max: the maximum address of period table * @period_min: the minimum address of period table * @offset: the initial offset address of duty and period * @middle: the middle address of duty and period * @max_hold: the time to stop at maximum address * @min_hold: the time to stop at minimum address * @middle_hold: the time to stop at middle address */ struct rockchip_pwm_wave_config { struct rockchip_pwm_wave_table *duty_table; struct rockchip_pwm_wave_table *period_table; bool enable; bool duty_en; bool period_en; u16 rpt; u32 width_mode; u32 update_mode; u32 duty_max; u32 duty_min; u32 period_max; u32 period_min; u32 offset; u32 middle; u32 max_hold; u32 min_hold; u32 middle_hold; }; #if IS_REACHABLE(CONFIG_PWM_ROCKCHIP) /** * rockchip_pwm_set_counter() - setup pwm counter mode * @pwm: PWM device * @enable: enable/disable counter mode * * Returns: 0 on success or a negative error code on failure. */ int rockchip_pwm_set_counter(struct pwm_device *pwm, bool enable); /** * rockchip_pwm_get_counter_result() - get counter result * @pwm: PWM device * @counter_res: number of input waveforms * @is_clear: clear counter result or not * * Returns: 0 on success or a negative error code on failure. */ int rockchip_pwm_get_counter_result(struct pwm_device *pwm, unsigned long *counter_res, bool is_clear); /** * rockchip_pwm_set_freq_meter() - setup pwm frequency meter mode * @pwm: PWM device * @delay_ms: time to wait, in milliseconds, before getting frequency meter result * @freq_hz: parameter in Hz to fill with frequency meter result * * Returns: 0 on success or a negative error code on failure. */ int rockchip_pwm_set_freq_meter(struct pwm_device *pwm, unsigned long delay_ms, unsigned long *freq_hz); /** * rockchip_pwm_global_ctrl() - execute global control commands * @pwm: PWM device * @cmd: command type to execute * * Returns: 0 on success or a negative error code on failure. */ int rockchip_pwm_global_ctrl(struct pwm_device *pwm, enum rockchip_pwm_global_ctrl_cmd cmd); /** * rockchip_pwm_set_wave() - setup pwm wave generator mode * @pwm: PWM device * @config: configs of wave generator mode * * Returns: 0 on success or a negative error code on failure. */ int rockchip_pwm_set_wave(struct pwm_device *pwm, struct rockchip_pwm_wave_config *config); #else static inline int rockchip_pwm_set_counter(struct pwm_device *pwm, bool enable) { return 0; } static inline int rockchip_pwm_get_counter_result(struct pwm_device *pwm, unsigned long *counter_res, bool is_clear) { return 0; } static inline int rockchip_pwm_set_freq_meter(struct pwm_device *pwm, unsigned long delay_ms, unsigned long *freq_hz) { return 0; } static inline int rockchip_pwm_global_ctrl(struct pwm_device *pwm, enum rockchip_pwm_global_ctrl_cmd cmd) { return 0; } static inline int rockchip_pwm_set_wave(struct pwm_device *pwm, struct rockchip_pwm_wave_config *config) { return 0; } #endif #endif /* _PWM_ROCKCHIP_H_ */