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)
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)
{
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 */
tdc_acam_reset(tdc);
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);
}
......
......@@ -31,20 +31,17 @@ DEFINE_ZATTR_STD(ZDEV, tdc_zattr_dev_std) = {
static struct zio_attribute tdc_zattr_dev[] = {
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("current_utc_time", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100),
ZATTR_EXT_REG("set_utc_time", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100),
ZATTR_EXT_REG("input_enable", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100), /* XXX: Needed ?? */
ZATTR_EXT_REG("dac_word", _RW_, TDC_ATTR_DEV_TIME_THRESH, 100),
ZATTR_EXT_REG("activate_adquisition", _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", S_IWUGO, TDC_ATTR_DEV_SET_UTC, 0),
ZATTR_EXT_REG("input_enable", _RW_, TDC_ATTR_DEV_INPUT_ENABLED, 0x1F),
ZATTR_EXT_REG("dac_word", _RW_, TDC_ATTR_DEV_DAC_WORD, 0),
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[] = {
{
SET_OBJECT_NAME("tdc-cset0"),
......@@ -53,8 +50,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = {
.ext_zattr = tdc_zattr_cset,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset),
.ext_zattr = NULL,
.n_ext_attr = 0,
},
},
{
......@@ -64,8 +61,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = {
.ext_zattr = tdc_zattr_cset,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset),
.ext_zattr = NULL,
.n_ext_attr = 0,
},
},
{
......@@ -75,8 +72,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = {
.ext_zattr = tdc_zattr_cset,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset),
.ext_zattr = NULL,
.n_ext_attr = 0,
},
},
{
......@@ -86,8 +83,8 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = {
.ext_zattr = tdc_zattr_cset,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset),
.ext_zattr = NULL,
.n_ext_attr = 0,
},
},
{
......@@ -97,39 +94,50 @@ static struct zio_cset tdc_cset[] = {
.ssize = 4, /* FIXME: 0? */
.flags = ZIO_DIR_INPUT | ZCSET_TYPE_TIME,
.zattr_set = {
.ext_zattr = tdc_zattr_cset,
.n_ext_attr = ARRAY_SIZE(tdc_zattr_cset),
.ext_zattr = NULL,
.n_ext_attr = 0,
},
},
};
static int tdc_zio_conf_set(struct device *dev,
struct zio_attribute *zattr,
uint32_t usr_val)
uint32_t usr_val)
{
struct zio_device *zdev;
struct zio_cset *cset;
struct zio_attribute *attr;
int chan;
struct spec_tdc *tdc;
cset = to_zio_cset(dev);
chan = cset->index - 1;
zdev = to_zio_dev(dev);
attr = zdev->zattr_set.ext_zattr;
tdc = zdev->priv_d;
switch (zattr->priv.addr) {
case TDC_ATTR_DEV_TSTAMPS_THRESH:
/* TODO: set value in the device */
pr_err("New value for timestamps threshold: %i\n", usr_val);
case TDC_ATTR_DEV_TSTAMP_THRESH:
tdc_set_irq_tstamp_thresh(tdc, usr_val);
break;
case TDC_ATTR_DEV_TIME_THRESH:
/* TODO: set value in the device */
pr_err("New value for time threshold: %i\n", usr_val);
tdc_set_irq_time_thresh(tdc, 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;
case TDC_ATTR_CHAN_ENABLED:
/* TODO: set value in the device */
pr_err("New value for enabled in channel %i: %i\n",
chan, usr_val);
case TDC_ATTR_DEV_DAC_WORD:
tdc_set_dac_word(tdc, usr_val);
break;
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;
default:
return -EINVAL;
......@@ -143,29 +151,33 @@ static int tdc_zio_info_get(struct device *dev,
uint32_t *usr_val)
{
struct zio_device *zdev;
struct zio_cset *cset;
struct zio_attribute *attr;
struct spec_tdc *tdc;
cset = to_zio_cset(dev);
zdev = to_zio_dev(dev);
attr = zdev->zattr_set.ext_zattr;
tdc = zdev->priv_d;
switch (zattr->priv.addr) {
case TDC_ATTR_DEV_TSTAMPS_THRESH:
/* TODO: get value from device */
pr_err("Value for timestamps threshold: %i\n", 100);
*usr_val = 100;
case TDC_ATTR_DEV_TSTAMP_THRESH:
*usr_val = tdc_get_irq_tstamp_thresh(tdc);
break;
case TDC_ATTR_DEV_TIME_THRESH:
/* TODO: get value from device */
pr_err("Value for time threshold: %i\n", 100);
*usr_val = 100;
*usr_val = tdc_get_irq_time_thresh(tdc);
break;
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;
case TDC_ATTR_CHAN_ENABLED:
/* TODO: get value from device */
*usr_val = 1;
pr_err("Value for enabled in channel %i: %i\n",
cset->index, 1);
case TDC_ATTR_DEV_ACTIVATE_ACQUISITION:
*usr_val = atomic_read(&tdc->busy);
break;
default:
return -EINVAL;
......
......@@ -14,6 +14,7 @@ struct spec_tdc {
unsigned char __iomem *regs;
unsigned char __iomem *gn412x_regs;
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
* XXX: Watch out the Da Capo Flag! It may confuse us!
*/
......@@ -36,17 +37,16 @@ struct tdc_acam_cfg {
/* Device-wide ZIO attributes */
enum tdc_zattr_dev_idx {
TDC_ATTR_DEV_VERSION = 0,
TDC_ATTR_DEV_TSTAMPS_THRESH,
TDC_ATTR_DEV_TSTAMP_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,
};
/* Channel ZIO attributes */
enum tdc_zattr_chan_idx {
TDC_ATTR_CHAN_ENABLED = TDC_ATTR_DEV__LAST,
TDC_ATTR_CHAN__LAST,
};
/* ZIO helper functions */
extern int tdc_zio_register_device(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);
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_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_activate_adquisition(struct spec_tdc *tdc);
extern void tdc_deactivate_adquisition(struct spec_tdc *tdc);
extern void tdc_activate_acquisition(struct spec_tdc *tdc);
extern void tdc_deactivate_acquisition(struct spec_tdc *tdc);
#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