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
37 #define PWMDAC_MCLK 4096000
39 enum pwmdac_lr_change{
49 enum pwmdac_shift_bit{
50 PWMDAC_SHIFT_8 = 8, /*pwmdac shift 8 bit*/
51 PWMDAC_SHIFT_10 = 10, /*pwmdac shift 10 bit*/
54 enum pwmdac_duty_cycle{
55 PWMDAC_CYCLE_LEFT = 0, /*pwmdac duty cycle left*/
56 PWMDAC_CYCLE_RIGHT = 1, /*pwmdac duty cycle right*/
57 PWMDAC_CYCLE_CENTER = 2, /*pwmdac duty cycle center*/
60 /*sample count [12:4] <511*/
61 enum pwmdac_sample_count{
62 PWMDAC_SAMPLE_CNT_1 = 1,
69 PWMDAC_SAMPLE_CNT_8 = 1, /*(32.468/8) == (12.288/3) == 4.096*/
81 PWMDAC_SAMPLE_CNT_20 = 20,
82 PWMDAC_SAMPLE_CNT_30 = 30,
83 PWMDAC_SAMPLE_CNT_511 = 511,
87 PWMDAC_DATA_LEFT_SHIFT_BIT_0 = 0,
88 PWMDAC_DATA_LEFT_SHIFT_BIT_1,
89 PWMDAC_DATA_LEFT_SHIFT_BIT_2,
90 PWMDAC_DATA_LEFT_SHIFT_BIT_3,
91 PWMDAC_DATA_LEFT_SHIFT_BIT_4,
92 PWMDAC_DATA_LEFT_SHIFT_BIT_5,
93 PWMDAC_DATA_LEFT_SHIFT_BIT_6,
94 PWMDAC_DATA_LEFT_SHIFT_BIT_7,
95 PWMDAC_DATA_LEFT_SHIFT_BIT_ALL,
98 enum pwmdac_config_list{
99 shift_8Bit_unsigned = 0,
100 shift_8Bit_unsigned_dataShift,
101 shift_10Bit_unsigned,
102 shift_10Bit_unsigned_dataShift,
105 shift_8Bit_inverter_dataShift,
106 shift_10Bit_inverter,
107 shift_10Bit_inverter_dataShift,
110 struct sf_pwmdac_dev {
111 void __iomem *pwmdac_base;
112 resource_size_t mapbase;
125 struct clk *clk_apb0;
126 struct clk *clk_pwmdac_apb;
127 struct clk *clk_pwmdac_core;
128 struct reset_control *rst_apb;
131 struct snd_dmaengine_dai_dma_data play_dma_data;
132 struct snd_pcm_substream __rcu *tx_substream;
133 unsigned int (*tx_fn)(struct sf_pwmdac_dev *dev,
134 struct snd_pcm_runtime *runtime, unsigned int tx_ptr,
135 bool *period_elapsed);
137 struct task_struct *tx_thread;
140 struct clk *audio_src;
141 struct clk *pwmdac_apb;
142 struct clk *pwmdac_mclk;
143 unsigned int pwmdac_ctrl_data;
146 #if IS_ENABLED(CONFIG_SND_SOC_STARFIVE_PWMDAC_PCM)
147 void sf_pwmdac_pcm_push_tx(struct sf_pwmdac_dev *dev);
148 void sf_pwmdac_pcm_pop_rx(struct sf_pwmdac_dev *dev);
149 int sf_pwmdac_pcm_register(struct platform_device *pdev);
151 void sf_pwmdac_pcm_push_tx(struct sf_pwmdac_dev *dev) { }
152 void sf_pwmdac_pcm_pop_rx(struct sf_pwmdac_dev *dev) { }
153 int sf_pwmdac_pcm_register(struct platform_device *pdev)