mirror of https://github.com/OpenIPC/firmware.git
207 lines
5.0 KiB
Diff
207 lines
5.0 KiB
Diff
diff -drupN a/include/linux/mfd/ingenic-tcu.h b/include/linux/mfd/ingenic-tcu.h
|
||
--- a/include/linux/mfd/ingenic-tcu.h 1970-01-01 03:00:00.000000000 +0300
|
||
+++ b/include/linux/mfd/ingenic-tcu.h 2022-06-09 05:02:35.000000000 +0300
|
||
@@ -0,0 +1,202 @@
|
||
+#ifndef __INGENIC_TCU_H__
|
||
+#define __INGENIC_TCU_H__
|
||
+
|
||
+#include <dt-bindings/clock/ingenic-tcu.h>
|
||
+
|
||
+#define NR_TCU_CHNS TCU_NR_IRQS
|
||
+
|
||
+enum irq_bit {
|
||
+ FULL_BIT,
|
||
+ HALF_BIT,
|
||
+};
|
||
+enum tcu_prescale {
|
||
+ TCU_PRESCALE_1,
|
||
+ TCU_PRESCALE_4,
|
||
+ TCU_PRESCALE_16,
|
||
+ TCU_PRESCALE_64,
|
||
+ TCU_PRESCALE_256,
|
||
+ TCU_PRESCALE_1024
|
||
+};
|
||
+
|
||
+enum tcu_clksrc {
|
||
+ TCU_CLKSRC_PCK = 1,
|
||
+ TCU_CLKSRC_RTC = 2,
|
||
+ TCU_CLKSRC_EXT = 4
|
||
+};
|
||
+
|
||
+enum tcu_irq_type {
|
||
+ NULL_IRQ_MODE,
|
||
+ FULL_IRQ_MODE,
|
||
+ HALF_IRQ_MODE,
|
||
+ FULL_HALF_IRQ_MODE,
|
||
+};
|
||
+
|
||
+struct info_bits {
|
||
+ unsigned int id:CHANNEL_BASE_OFF*2;
|
||
+ unsigned int mode:CHANNEL_BASE_OFF;
|
||
+ unsigned int func:CHANNEL_BASE_OFF;
|
||
+ unsigned int pwmin:CHANNEL_BASE_OFF;
|
||
+};
|
||
+
|
||
+struct ingenic_tcu_chn {
|
||
+ union {
|
||
+ unsigned int chn_info;
|
||
+ struct info_bits cib;
|
||
+ };
|
||
+ unsigned int index;
|
||
+ char virq[2];
|
||
+ char irq_type;
|
||
+ char clk_src;
|
||
+
|
||
+ char clk_div;
|
||
+ char init_level;
|
||
+ char shutdown_mode;
|
||
+ char pwm_bapass_mode;
|
||
+
|
||
+ char is_pwm;
|
||
+ char is_count_clear;
|
||
+ char pwm_in_en;
|
||
+ char work_sleep;
|
||
+
|
||
+ int half_num;
|
||
+ int full_num;
|
||
+ struct device_node *np;
|
||
+ void (*enable)(int id);
|
||
+ void (*disable)(int id);
|
||
+};
|
||
+
|
||
+void tcu_start_counter(int id);
|
||
+void tcu_stop_counter(int id);
|
||
+void tcu_set_counter(int id, unsigned int val);
|
||
+int tcu_get_counter(int id);
|
||
+void tcu_enable_counter(int id);
|
||
+void tcu_disable_counter(int id);
|
||
+
|
||
+/**
|
||
+ * ingenic_tcu_set_full_num - set the number of tcu Timer Data FULL Register (TDFR)
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ * @full_num: the number of set TDFR.
|
||
+ *
|
||
+ */
|
||
+void ingenic_tcu_set_period(int id, uint16_t period);
|
||
+/**
|
||
+ * ingenic_tcu_set_half_num - set the number of tcu Timer Data FULL Register (TDHR)
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ * @half_num: the number of set TDFR.
|
||
+ *
|
||
+ */
|
||
+void ingenic_tcu_set_duty(int id, uint16_t duty);
|
||
+/**
|
||
+ * ingenic_tcu_set_prescale - set clk div of TCU prescale.
|
||
+ * Don‘t call the function when the channel is running.
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ * @prescale: the div of clk value.
|
||
+ *
|
||
+ */
|
||
+void ingenic_tcu_set_prescale(int id, enum tcu_prescale prescale);
|
||
+/**
|
||
+ * ingenic_tcu_set_pwm_output_init_level - set an initial output level for PWM output.
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ * @level: 0 LOW, 1 HIGH.
|
||
+ *
|
||
+ */
|
||
+void ingenic_tcu_set_pwm_output_init_level(int id, int level);
|
||
+/**
|
||
+ * ingenic_tcu_set_clksrc - set clk soruce of the timer clock input.
|
||
+ * Don‘t call the function when the channel is running.
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ * @src: the clk source;0 PCLK, 1 RTC, 2 EXT.
|
||
+ *
|
||
+ */
|
||
+void ingenic_tcu_set_clksrc(int id, enum tcu_clksrc src);
|
||
+/**
|
||
+ * ingenic_tcu_channel_to_virq - get virtual irq though to tcu channel id
|
||
+ * (channel 0 ~ 4, 6 ~ 7 use common hardware irq(TCU2))
|
||
+ *
|
||
+ * @tcu_chn: the struct of request cell(TCU channel).
|
||
+ *
|
||
+ * Search for a virq in a irq domain and save irq to struct ingenic_tcu_chn
|
||
+ * ->virq[2].
|
||
+ */
|
||
+void ingenic_tcu_channel_to_virq(struct ingenic_tcu_chn *tcu_chn);
|
||
+/**
|
||
+ * ingenic_tcu_get_count - get the value of the timer counter (TCNT).
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ *
|
||
+ * Returns number of timer counter on sucess,
|
||
+ * -EINVAL if The value read from counter 1 or 2 is a false value.
|
||
+ *
|
||
+ */
|
||
+int ingenic_tcu_get_count(int id);
|
||
+/**
|
||
+ * ingenic_tcu_config - init the current channel struct.
|
||
+ *
|
||
+ * @tcu_chn: tcu channel struct.
|
||
+ *
|
||
+ * Returns 0 on sucess,
|
||
+ * Returns < 0 if init failed.
|
||
+ *
|
||
+ */
|
||
+int ingenic_tcu_config(struct ingenic_tcu_chn *tcu_chn);
|
||
+/**
|
||
+ * ingenic_tcu_counter_begin - begin counting up, if channel function is pwm, enable pwm.
|
||
+ *
|
||
+ * @tcu_chn: tcu channel struct.
|
||
+ *
|
||
+ */
|
||
+int ingenic_tcu_counter_begin(struct ingenic_tcu_chn *tcu_chn);
|
||
+/**
|
||
+ * ingenic_tcu_counter_stop - stop counting up, if channel function is pwm, disable pwm.
|
||
+ *
|
||
+ * @tcu_chn: tcu channel struct.
|
||
+ *
|
||
+ * Explain:
|
||
+ * TCU count stop, is the next stop after match, not immediately stop.
|
||
+ * If you want to stop immediately, you can use cell->disable.
|
||
+ *
|
||
+ */
|
||
+void ingenic_tcu_counter_stop(struct ingenic_tcu_chn *tcu_chn);
|
||
+
|
||
+/**
|
||
+ * ingenic_watchdog_set_count - setwatchdog timer counter.
|
||
+ * This function is only used for watchdog.
|
||
+ *
|
||
+ * @value: the number of set watchdog counter.
|
||
+ *
|
||
+ */
|
||
+void ingenic_watchdog_set_count(unsigned int value);
|
||
+/**
|
||
+ * ingenic_watchdog_config - init watchdog.
|
||
+ * This function is only used for watchdog.
|
||
+ *
|
||
+ * @tcsr_val: the number of set watchdog TCSR.
|
||
+ * @timeout_value: the number of set watchdog TCNT.
|
||
+ *
|
||
+ */
|
||
+void ingenic_watchdog_config(unsigned int tcsr_val, unsigned int timeout_value);
|
||
+
|
||
+/**
|
||
+ * request_cell - request tcu channel cell.
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ *
|
||
+ * Returns struct cell on sucess,
|
||
+ * NULL if The channel busy.
|
||
+ *
|
||
+ */
|
||
+struct mfd_cell *request_cell(int id);
|
||
+/**
|
||
+ * free_cell - free tcu channel cell.
|
||
+ *
|
||
+ * @id: tcu channel id.
|
||
+ *
|
||
+ */
|
||
+void free_cell(int id);
|
||
+
|
||
+#endif /* __INGENIC_TCU_H__ */
|