2 * PWMDAC driver for the StarFive JH7110 SoC
4 * Copyright (C) 2022 StarFive Technology Co., Ltd.
7 #ifndef __STARFIVE_PWMDAC_LOCAL_H
8 #define __STARFIVE_PWMDAC_LOCAL_H
10 #include <linux/clk.h>
11 #include <linux/device.h>
12 #include <linux/types.h>
13 #include <sound/dmaengine_pcm.h>
14 #include <sound/pcm.h>
16 #define PWMDAC_WDATA 0 /*PWMDAC_BASE_ADDR*/
17 #define PWMDAC_CTRL 0x04 /*PWMDAC_BASE_ADDR + 0x04*/
18 #define PWMDAC_SATAE 0x08 /*PWMDAC_BASE_ADDR + 0x08*/
19 #define PWMDAC_RESERVED 0x0C /*PWMDAC_BASE_ADDR + 0x0C*/
21 #define SFC_PWMDAC_SHIFT BIT(1)
22 #define SFC_PWMDAC_DUTY_CYCLE BIT(2)
23 #define SFC_PWMDAC_CNT_N BIT(4)
25 #define SFC_PWMDAC_LEFT_RIGHT_DATA_CHANGE BIT(13)
26 #define SFC_PWMDAC_DATA_MODE BIT(14)
28 #define FIFO_UN_FULL 0
31 #define PWMDAC_CTRL_DATA_SHIFT 4
32 #define PWMDAC_CTRL_DATA_MASK 0xF
33 #define PWMDAC_DATA_LEFT_SHIFT 15
34 #define PWMDAC_DUTY_CYCLE_LOW 2
35 #define PWMDAC_DUTY_CYCLE_HIGH 3
40 #define PWMDAC_MCLK 4096000
42 enum pwmdac_lr_change{
52 enum pwmdac_shift_bit{
53 PWMDAC_SHIFT_8 = 8, /*pwmdac shift 8 bit*/
54 PWMDAC_SHIFT_10 = 10, /*pwmdac shift 10 bit*/
57 enum pwmdac_duty_cycle{
58 PWMDAC_CYCLE_LEFT = 0, /*pwmdac duty cycle left*/
59 PWMDAC_CYCLE_RIGHT = 1, /*pwmdac duty cycle right*/
60 PWMDAC_CYCLE_CENTER = 2, /*pwmdac duty cycle center*/
63 /*sample count [12:4] <511*/
64 enum pwmdac_sample_count{
65 PWMDAC_SAMPLE_CNT_1 = 1,
72 PWMDAC_SAMPLE_CNT_8 = 1, /*(32.468/8) == (12.288/3) == 4.096*/
84 PWMDAC_SAMPLE_CNT_20 = 20,
85 PWMDAC_SAMPLE_CNT_30 = 30,
86 PWMDAC_SAMPLE_CNT_511 = 511,
91 PWMDAC_DATA_LEFT_SHIFT_BIT_0 = 0,
92 PWMDAC_DATA_LEFT_SHIFT_BIT_1,
93 PWMDAC_DATA_LEFT_SHIFT_BIT_2,
94 PWMDAC_DATA_LEFT_SHIFT_BIT_3,
95 PWMDAC_DATA_LEFT_SHIFT_BIT_4,
96 PWMDAC_DATA_LEFT_SHIFT_BIT_5,
97 PWMDAC_DATA_LEFT_SHIFT_BIT_6,
98 PWMDAC_DATA_LEFT_SHIFT_BIT_7,
99 PWMDAC_DATA_LEFT_SHIFT_BIT_ALL,
102 enum pwmdac_config_list{
103 shift_8Bit_unsigned = 0,
104 shift_8Bit_unsigned_dataShift,
105 shift_10Bit_unsigned,
106 shift_10Bit_unsigned_dataShift,
109 shift_8Bit_inverter_dataShift,
110 shift_10Bit_inverter,
111 shift_10Bit_inverter_dataShift,
114 struct sf_pwmdac_dev {
115 void __iomem *pwmdac_base;
116 resource_size_t mapbase;
129 struct clk *clk_apb0;
130 struct clk *clk_pwmdac_apb;
131 struct clk *clk_pwmdac_core;
132 struct reset_control *rst_apb;
135 struct snd_dmaengine_dai_dma_data play_dma_data;
136 struct snd_pcm_substream __rcu *tx_substream;
137 unsigned int (*tx_fn)(struct sf_pwmdac_dev *dev,
138 struct snd_pcm_runtime *runtime, unsigned int tx_ptr,
139 bool *period_elapsed);
141 struct task_struct *tx_thread;
144 struct clk *audio_src;
145 struct clk *pwmdac_apb;
146 struct clk *pwmdac_mclk;
151 #if IS_ENABLED(CONFIG_SND_STARFIVE_PWMDAC_PCM)
152 void sf_pwmdac_pcm_push_tx(struct sf_pwmdac_dev *dev);
153 void sf_pwmdac_pcm_pop_rx(struct sf_pwmdac_dev *dev);
154 int sf_pwmdac_pcm_register(struct platform_device *pdev);
156 void sf_pwmdac_pcm_push_tx(struct sf_pwmdac_dev *dev) { }
157 void sf_pwmdac_pcm_pop_rx(struct sf_pwmdac_dev *dev) { }
158 int sf_pwmdac_pcm_register(struct platform_device *pdev)