Commit 411f5fd7 authored by Miguel Gómez Sexto's avatar Miguel Gómez Sexto

tdc: Added new ZIO attributes and connected to tdc functions.

Signed-off-by: Miguel Gómez Sexto's avatarMiguel Gómez <magomez@igalia.com>
parent 4065bafd
...@@ -65,19 +65,24 @@ void tdc_set_dac_word(struct spec_tdc *tdc, u32 val) ...@@ -65,19 +65,24 @@ void tdc_set_dac_word(struct spec_tdc *tdc, u32 val)
writel(TDC_CTRL_CONFIG_DAC, tdc->base + TDC_CTRL_REG); writel(TDC_CTRL_CONFIG_DAC, tdc->base + TDC_CTRL_REG);
} }
u32 tdc_get_dac_word(struct spec_tdc *tdc)
{
return readl(tdc->base + TDC_DAC_WORD_R);
}
void tdc_clear_da_capo_flag(struct spec_tdc *tdc) void tdc_clear_da_capo_flag(struct spec_tdc *tdc)
{ {
writel(TDC_CTRL_CLEAR_DACAPO_FLAG, tdc->base + TDC_CTRL_REG); writel(TDC_CTRL_CLEAR_DACAPO_FLAG, tdc->base + TDC_CTRL_REG);
} }
void tdc_activate_adquisition(struct spec_tdc *tdc) void tdc_activate_acquisition(struct spec_tdc *tdc)
{ {
/* Before activate the adquisition is required to reset the ACAM chip */ /* Before activate the adquisition is required to reset the ACAM chip */
tdc_acam_reset(tdc); tdc_acam_reset(tdc);
writel(TDC_CTRL_EN_ACQ, tdc->base + TDC_CTRL_REG); writel(TDC_CTRL_EN_ACQ, tdc->base + TDC_CTRL_REG);
} }
void tdc_deactivate_adquisition(struct spec_tdc *tdc) void tdc_deactivate_acquisition(struct spec_tdc *tdc)
{ {
writel(TDC_CTRL_DIS_ACQ, tdc->base + TDC_CTRL_REG); writel(TDC_CTRL_DIS_ACQ, tdc->base + TDC_CTRL_REG);
} }
......
...@@ -31,20 +31,17 @@ DEFINE_ZATTR_STD(ZDEV, tdc_zattr_dev_std) = { ...@@ -31,20 +31,17 @@ DEFINE_ZATTR_STD(ZDEV, tdc_zattr_dev_std) = {
static struct zio_attribute tdc_zattr_dev[] = { static struct zio_attribute tdc_zattr_dev[] = {
ZATTR_EXT_REG("version", S_IRUGO, TDC_ATTR_DEV_VERSION, TDC_VERSION), ZATTR_EXT_REG("version", S_IRUGO, TDC_ATTR_DEV_VERSION, TDC_VERSION),
ZATTR_EXT_REG("tstamps-thresh", _RW_, TDC_ATTR_DEV_TSTAMPS_THRESH, 100), ZATTR_EXT_REG("tstamp-thresh", _RW_, TDC_ATTR_DEV_TSTAMP_THRESH, 100),
ZATTR_EXT_REG("time-thresh", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), ZATTR_EXT_REG("time-thresh", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100),
ZATTR_EXT_REG("current_utc_time", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), ZATTR_EXT_REG("current_utc_time", S_IRUGO, TDC_ATTR_DEV_CURRENT_UTC, 0),
ZATTR_EXT_REG("set_utc_time", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), ZATTR_EXT_REG("set_utc_time", S_IWUGO, TDC_ATTR_DEV_SET_UTC, 0),
ZATTR_EXT_REG("input_enable", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), /* XXX: Needed ?? */ ZATTR_EXT_REG("input_enable", _RW_, TDC_ATTR_DEV_INPUT_ENABLED, 0x1F),
ZATTR_EXT_REG("dac_word", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), ZATTR_EXT_REG("dac_word", _RW_, TDC_ATTR_DEV_DAC_WORD, 0),
ZATTR_EXT_REG("activate_adquisition", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), ZATTR_EXT_REG("activate_acquisition", _RW_,
TDC_ATTR_DEV_ACTIVATE_ACQUISITION, 0),
}; };
static struct zio_attribute tdc_zattr_cset[] = {
ZATTR_EXT_REG("enabled", _RW_, TDC_ATTR_CHAN_ENABLED, 1),
};
static struct zio_cset tdc_cset[] = { static struct zio_cset tdc_cset[] = {
{ {
SET_OBJECT_NAME("tdc-cset0"), SET_OBJECT_NAME("tdc-cset0"),
...@@ -53,8 +50,8 @@ static struct zio_cset tdc_cset[] = { ...@@ -53,8 +50,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */ .ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME, .flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = { .zattr_set = {
.ext_zattr = tdc_zattr_cset, .ext_zattr = NULL,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset), .n_ext_attr = 0,
}, },
}, },
{ {
...@@ -64,8 +61,8 @@ static struct zio_cset tdc_cset[] = { ...@@ -64,8 +61,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */ .ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME, .flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = { .zattr_set = {
.ext_zattr = tdc_zattr_cset, .ext_zattr = NULL,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset), .n_ext_attr = 0,
}, },
}, },
{ {
...@@ -75,8 +72,8 @@ static struct zio_cset tdc_cset[] = { ...@@ -75,8 +72,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */ .ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME, .flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = { .zattr_set = {
.ext_zattr = tdc_zattr_cset, .ext_zattr = NULL,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset), .n_ext_attr = 0,
}, },
}, },
{ {
...@@ -86,8 +83,8 @@ static struct zio_cset tdc_cset[] = { ...@@ -86,8 +83,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */ .ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME, .flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = { .zattr_set = {
.ext_zattr = tdc_zattr_cset, .ext_zattr = NULL,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset), .n_ext_attr = 0,
}, },
}, },
{ {
...@@ -97,39 +94,50 @@ static struct zio_cset tdc_cset[] = { ...@@ -97,39 +94,50 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */ .ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME, .flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = { .zattr_set = {
.ext_zattr = tdc_zattr_cset, .ext_zattr = NULL,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset), .n_ext_attr = 0,
}, },
}, },
}; };
static int tdc_zio_conf_set(struct device *dev, static int tdc_zio_conf_set(struct device *dev,
struct zio_attribute *zattr, struct zio_attribute *zattr,
uint32_t usr_val) uint32_t usr_val)
{ {
struct zio_device *zdev; struct zio_device *zdev;
struct zio_cset *cset;
struct zio_attribute *attr; struct zio_attribute *attr;
int chan; struct spec_tdc *tdc;
cset = to_zio_cset(dev);
chan = cset->index - 1;
zdev = to_zio_dev(dev); zdev = to_zio_dev(dev);
attr = zdev->zattr_set.ext_zattr; attr = zdev->zattr_set.ext_zattr;
tdc = zdev->priv_d;
switch (zattr->priv.addr) { switch (zattr->priv.addr) {
case TDC_ATTR_DEV_TSTAMPS_THRESH: case TDC_ATTR_DEV_TSTAMP_THRESH:
/* TODO: set value in the device */ tdc_set_irq_tstamp_thresh(tdc, usr_val);
pr_err("New value for timestamps threshold: %i\n", usr_val);
break; break;
case TDC_ATTR_DEV_TIME_THRESH: case TDC_ATTR_DEV_TIME_THRESH:
/* TODO: set value in the device */ tdc_set_irq_time_thresh(tdc, usr_val);
pr_err("New value for time threshold: %i\n", usr_val); break;
case TDC_ATTR_DEV_CURRENT_UTC:
break;
case TDC_ATTR_DEV_SET_UTC:
tdc_set_utc_time(tdc);
break;
case TDC_ATTR_DEV_INPUT_ENABLED:
tdc_set_input_enable(tdc, usr_val);
break; break;
case TDC_ATTR_CHAN_ENABLED: case TDC_ATTR_DEV_DAC_WORD:
/* TODO: set value in the device */ tdc_set_dac_word(tdc, usr_val);
pr_err("New value for enabled in channel %i: %i\n", break;
chan, usr_val); case TDC_ATTR_DEV_ACTIVATE_ACQUISITION:
if (usr_val) {
atomic_set(&tdc->busy, 1);
tdc_activate_acquisition(tdc);
} else {
atomic_set(&tdc->busy, 0);
tdc_deactivate_acquisition(tdc);
}
break; break;
default: default:
return -EINVAL; return -EINVAL;
...@@ -143,29 +151,33 @@ static int tdc_zio_info_get(struct device *dev, ...@@ -143,29 +151,33 @@ static int tdc_zio_info_get(struct device *dev,
uint32_t *usr_val) uint32_t *usr_val)
{ {
struct zio_device *zdev; struct zio_device *zdev;
struct zio_cset *cset;
struct zio_attribute *attr; struct zio_attribute *attr;
struct spec_tdc *tdc;
cset = to_zio_cset(dev);
zdev = to_zio_dev(dev); zdev = to_zio_dev(dev);
attr = zdev->zattr_set.ext_zattr; attr = zdev->zattr_set.ext_zattr;
tdc = zdev->priv_d;
switch (zattr->priv.addr) { switch (zattr->priv.addr) {
case TDC_ATTR_DEV_TSTAMPS_THRESH: case TDC_ATTR_DEV_TSTAMP_THRESH:
/* TODO: get value from device */ *usr_val = tdc_get_irq_tstamp_thresh(tdc);
pr_err("Value for timestamps threshold: %i\n", 100);
*usr_val = 100;
break; break;
case TDC_ATTR_DEV_TIME_THRESH: case TDC_ATTR_DEV_TIME_THRESH:
/* TODO: get value from device */ *usr_val = tdc_get_irq_time_thresh(tdc);
pr_err("Value for time threshold: %i\n", 100); break;
*usr_val = 100; case TDC_ATTR_DEV_CURRENT_UTC:
*usr_val = tdc_get_current_utc_time(tdc);
break;
case TDC_ATTR_DEV_SET_UTC:
break;
case TDC_ATTR_DEV_INPUT_ENABLED:
*usr_val = tdc_get_input_enable(tdc);
break;
case TDC_ATTR_DEV_DAC_WORD:
*usr_val = tdc_get_dac_word(tdc);
break; break;
case TDC_ATTR_CHAN_ENABLED: case TDC_ATTR_DEV_ACTIVATE_ACQUISITION:
/* TODO: get value from device */ *usr_val = atomic_read(&tdc->busy);
*usr_val = 1;
pr_err("Value for enabled in channel %i: %i\n",
cset->index, 1);
break; break;
default: default:
return -EINVAL; return -EINVAL;
......
...@@ -14,6 +14,7 @@ struct spec_tdc { ...@@ -14,6 +14,7 @@ struct spec_tdc {
unsigned char __iomem *regs; unsigned char __iomem *regs;
unsigned char __iomem *gn412x_regs; unsigned char __iomem *gn412x_regs;
struct work_struct irq_work; struct work_struct irq_work;
atomic_t busy; /* whether the device is acquiring data */
u32 wr_pointer; /* XXX: Used to save the previous value of the wr_pointer u32 wr_pointer; /* XXX: Used to save the previous value of the wr_pointer
* XXX: Watch out the Da Capo Flag! It may confuse us! * XXX: Watch out the Da Capo Flag! It may confuse us!
*/ */
...@@ -36,17 +37,16 @@ struct tdc_acam_cfg { ...@@ -36,17 +37,16 @@ struct tdc_acam_cfg {
/* 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,
TDC_ATTR_DEV_TSTAMPS_THRESH, TDC_ATTR_DEV_TSTAMP_THRESH,
TDC_ATTR_DEV_TIME_THRESH, TDC_ATTR_DEV_TIME_THRESH,
TDC_ATTR_DEV_CURRENT_UTC,
TDC_ATTR_DEV_SET_UTC,
TDC_ATTR_DEV_INPUT_ENABLED,
TDC_ATTR_DEV_DAC_WORD,
TDC_ATTR_DEV_ACTIVATE_ACQUISITION,
TDC_ATTR_DEV__LAST, TDC_ATTR_DEV__LAST,
}; };
/* Channel ZIO attributes */
enum tdc_zattr_chan_idx {
TDC_ATTR_CHAN_ENABLED = TDC_ATTR_DEV__LAST,
TDC_ATTR_CHAN__LAST,
};
/* ZIO helper functions */ /* ZIO helper functions */
extern int tdc_zio_register_device(struct spec_tdc *tdc); extern int tdc_zio_register_device(struct spec_tdc *tdc);
extern void tdc_zio_remove(struct spec_tdc *tdc); extern void tdc_zio_remove(struct spec_tdc *tdc);
...@@ -87,9 +87,10 @@ extern u32 tdc_get_irq_tstamp_thresh(struct spec_tdc *tdc); ...@@ -87,9 +87,10 @@ extern u32 tdc_get_irq_tstamp_thresh(struct spec_tdc *tdc);
extern u32 tdc_get_irq_time_thresh(struct spec_tdc *tdc); extern u32 tdc_get_irq_time_thresh(struct spec_tdc *tdc);
extern u32 tdc_get_current_utc_time(struct spec_tdc *tdc); extern u32 tdc_get_current_utc_time(struct spec_tdc *tdc);
extern u32 tdc_get_circular_buffer_wr_pointer(struct spec_tdc *tdc); extern u32 tdc_get_circular_buffer_wr_pointer(struct spec_tdc *tdc);
extern u32 tdc_get_dac_word(struct spec_tdc *tdc);
extern void tdc_clear_da_capo_flag(struct spec_tdc *tdc); extern void tdc_clear_da_capo_flag(struct spec_tdc *tdc);
extern void tdc_activate_adquisition(struct spec_tdc *tdc); extern void tdc_activate_acquisition(struct spec_tdc *tdc);
extern void tdc_deactivate_adquisition(struct spec_tdc *tdc); extern void tdc_deactivate_acquisition(struct spec_tdc *tdc);
#endif #endif
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