tdc: added read and load config functions for acam chip

Signed-off-by: Samuel Iglesias Gonsálvez's avatarSamuel Iglesias Gonsálvez <siglesias@igalia.com>
parent 3f20a0fb
...@@ -22,7 +22,59 @@ void tdc_acam_reset(struct spec_tdc *tdc) ...@@ -22,7 +22,59 @@ void tdc_acam_reset(struct spec_tdc *tdc)
writel(TDC_CTRL_RESET_ACAM, tdc->base + TDC_CTRL_REG); writel(TDC_CTRL_RESET_ACAM, tdc->base + TDC_CTRL_REG);
} }
void tdc_acam_load_config(struct spec_tdc *tdc) static void __tdc_acam_do_load_config(struct spec_tdc *tdc)
{ {
writel(TDC_CTRL_LOAD_ACAM_CFG, tdc->base + TDC_CTRL_REG); writel(TDC_CTRL_LOAD_ACAM_CFG, tdc->base + TDC_CTRL_REG);
} }
static void __tdc_acam_do_read_config(struct spec_tdc *tdc)
{
writel(TDC_CTRL_READ_ACAM_CFG, tdc->base + TDC_CTRL_REG);
}
int tdc_acam_load_config(struct spec_tdc *tdc, struct tdc_acam_cfg *cfg)
{
/* Write the configuration parameters to the registers */
writel(cfg->edge_config, tdc->base + TDC_ACAM_CFG_REG_0);
writel(cfg->channel_adj, tdc->base + TDC_ACAM_CFG_REG_1);
writel(cfg->mode_enable, tdc->base + TDC_ACAM_CFG_REG_2);
writel(cfg->resolution, tdc->base + TDC_ACAM_CFG_REG_3);
writel(cfg->start_timer_set, tdc->base + TDC_ACAM_CFG_REG_4);
writel(cfg->start_retrigger, tdc->base + TDC_ACAM_CFG_REG_5);
writel(cfg->lf_flags_level, tdc->base + TDC_ACAM_CFG_REG_6);
writel(cfg->pll, tdc->base + TDC_ACAM_CFG_REG_7);
writel(cfg->err_flag_cfg, tdc->base + TDC_ACAM_CFG_REG_11);
writel(cfg->int_flag_cfg, tdc->base + TDC_ACAM_CFG_REG_12);
writel(cfg->ctrl_16_bit_mode, tdc->base + TDC_ACAM_CFG_REG_14);
/* Send the load command to the firmware */
__tdc_acam_do_load_config(tdc);
return 0;
}
int tdc_acam_get_config(struct spec_tdc *tdc, struct tdc_acam_cfg *cfg)
{
/* Send read config command to retrieve the data to the registers */
__tdc_acam_do_read_config(tdc);
/* Read the configuration values from the read-back registers */
cfg->edge_config = readl(tdc->base + TDC_ACAM_RDBACK_REG_0);
cfg->channel_adj = readl(tdc->base + TDC_ACAM_RDBACK_REG_1);
cfg->mode_enable = readl(tdc->base + TDC_ACAM_RDBACK_REG_2);
cfg->resolution = readl(tdc->base + TDC_ACAM_RDBACK_REG_3);
cfg->start_timer_set = readl(tdc->base + TDC_ACAM_RDBACK_REG_4);
cfg->start_retrigger = readl(tdc->base + TDC_ACAM_RDBACK_REG_5);
cfg->lf_flags_level = readl(tdc->base + TDC_ACAM_RDBACK_REG_6);
cfg->pll = readl(tdc->base + TDC_ACAM_RDBACK_REG_7);
cfg->ififo1 = readl(tdc->base + TDC_ACAM_RDBACK_REG_8);
cfg->ififo2 = readl(tdc->base + TDC_ACAM_RDBACK_REG_9);
cfg->start01 = readl(tdc->base + TDC_ACAM_RDBACK_REG_10);
cfg->err_flag_cfg = readl(tdc->base + TDC_ACAM_RDBACK_REG_11);
cfg->int_flag_cfg = readl(tdc->base + TDC_ACAM_RDBACK_REG_12);
cfg->ctrl_16_bit_mode = readl(tdc->base + TDC_ACAM_RDBACK_REG_14);
return 0;
}
...@@ -11,6 +11,23 @@ struct spec_tdc { ...@@ -11,6 +11,23 @@ struct spec_tdc {
unsigned char __iomem *gn412x_regs; unsigned char __iomem *gn412x_regs;
}; };
struct tdc_acam_cfg {
u32 edge_config; /* ACAM reg. 0 */
u32 channel_adj; /* ACAM reg. 1 */
u32 mode_enable; /* ACAM reg. 2 */
u32 resolution; /* ACAM reg. 3 */
u32 start_timer_set; /* ACAM reg. 4 */
u32 start_retrigger; /* ACAM reg. 5 */
u32 lf_flags_level; /* ACAM reg. 6 */
u32 pll; /* ACAM reg. 7 */
u32 ififo1; /* ACAM reg. 8 */
u32 ififo2; /* ACAM reg. 9 */
u32 start01; /* ACAM reg. 10 */
u32 err_flag_cfg; /* ACAM reg. 11 */
u32 int_flag_cfg; /* ACAM reg. 12 */
u32 ctrl_16_bit_mode; /* ACAM reg. 14 */
};
/* Device-wide ZIO attributes */ /* Device-wide ZIO attributes */
enum tdc_zattr_dev_idx { enum tdc_zattr_dev_idx {
TDC_ATTR_DEV_VERSION = 0, TDC_ATTR_DEV_VERSION = 0,
...@@ -28,7 +45,8 @@ extern int tdc_spec_init(void); ...@@ -28,7 +45,8 @@ extern int tdc_spec_init(void);
extern void tdc_spec_exit(void); extern void tdc_spec_exit(void);
void tdc_acam_reset(struct spec_tdc *tdc); void tdc_acam_reset(struct spec_tdc *tdc);
void tdc_acam_load_config(struct spec_tdc *tdc); int tdc_acam_load_config(struct spec_tdc *tdc, struct tdc_acam_cfg *cfg);
int tdc_acam_read_config(struct spec_tdc *tdc, struct tdc_acam_cfg *cfg);
int tdc_probe(struct spec_dev *dev); int tdc_probe(struct spec_dev *dev);
void tdc_remove(struct spec_dev *dev); void tdc_remove(struct spec_dev *dev);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment