ptp: ocp: parameterize input/output sma selectors
Group the sma input/output tables together and select the correct group from the bp information. This allows adding new groups with different sma mappings. Signed-off-by: Jonathan Lemon <jonathan.lemon@gmail.com> Signed-off-by: Jakub Kicinski <kuba@kernel.org>
This commit is contained in:
parent
5a728ac578
commit
aa56a7ffc0
1 changed files with 27 additions and 15 deletions
|
@ -321,6 +321,7 @@ struct ptp_ocp {
|
||||||
u64 fw_cap;
|
u64 fw_cap;
|
||||||
struct ptp_ocp_signal signal[4];
|
struct ptp_ocp_signal signal[4];
|
||||||
struct ptp_ocp_sma_connector sma[4];
|
struct ptp_ocp_sma_connector sma[4];
|
||||||
|
u8 sma_tbl;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define OCP_REQ_TIMESTAMP BIT(0)
|
#define OCP_REQ_TIMESTAMP BIT(0)
|
||||||
|
@ -699,6 +700,10 @@ static struct ocp_selector ptp_ocp_sma_out[] = {
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static struct ocp_selector *ocp_sma_tbl[][2] = {
|
||||||
|
{ ptp_ocp_sma_in, ptp_ocp_sma_out },
|
||||||
|
};
|
||||||
|
|
||||||
static const char *
|
static const char *
|
||||||
ptp_ocp_select_name_from_val(struct ocp_selector *tbl, int val)
|
ptp_ocp_select_name_from_val(struct ocp_selector *tbl, int val)
|
||||||
{
|
{
|
||||||
|
@ -2088,35 +2093,35 @@ __handle_signal_inputs(struct ptp_ocp *bp, u32 val)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ptp_ocp_show_output(u32 val, char *buf, int def_val)
|
ptp_ocp_show_output(struct ocp_selector *tbl, u32 val, char *buf, int def_val)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
ssize_t count;
|
ssize_t count;
|
||||||
|
|
||||||
count = sysfs_emit(buf, "OUT: ");
|
count = sysfs_emit(buf, "OUT: ");
|
||||||
name = ptp_ocp_select_name_from_val(ptp_ocp_sma_out, val);
|
name = ptp_ocp_select_name_from_val(tbl, val);
|
||||||
if (!name)
|
if (!name)
|
||||||
name = ptp_ocp_select_name_from_val(ptp_ocp_sma_out, def_val);
|
name = ptp_ocp_select_name_from_val(tbl, def_val);
|
||||||
count += sysfs_emit_at(buf, count, "%s\n", name);
|
count += sysfs_emit_at(buf, count, "%s\n", name);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
ptp_ocp_show_inputs(u32 val, char *buf, int def_val)
|
ptp_ocp_show_inputs(struct ocp_selector *tbl, u32 val, char *buf, int def_val)
|
||||||
{
|
{
|
||||||
const char *name;
|
const char *name;
|
||||||
ssize_t count;
|
ssize_t count;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
count = sysfs_emit(buf, "IN: ");
|
count = sysfs_emit(buf, "IN: ");
|
||||||
for (i = 0; i < ARRAY_SIZE(ptp_ocp_sma_in); i++) {
|
for (i = 0; tbl[i].name; i++) {
|
||||||
if (val & ptp_ocp_sma_in[i].value) {
|
if (val & tbl[i].value) {
|
||||||
name = ptp_ocp_sma_in[i].name;
|
name = tbl[i].name;
|
||||||
count += sysfs_emit_at(buf, count, "%s ", name);
|
count += sysfs_emit_at(buf, count, "%s ", name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!val && def_val >= 0) {
|
if (!val && def_val >= 0) {
|
||||||
name = ptp_ocp_select_name_from_val(ptp_ocp_sma_in, def_val);
|
name = ptp_ocp_select_name_from_val(tbl, def_val);
|
||||||
count += sysfs_emit_at(buf, count, "%s ", name);
|
count += sysfs_emit_at(buf, count, "%s ", name);
|
||||||
}
|
}
|
||||||
if (count)
|
if (count)
|
||||||
|
@ -2126,9 +2131,9 @@ ptp_ocp_show_inputs(u32 val, char *buf, int def_val)
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
sma_parse_inputs(const char *buf, enum ptp_ocp_sma_mode *mode)
|
sma_parse_inputs(struct ocp_selector *tbl[], const char *buf,
|
||||||
|
enum ptp_ocp_sma_mode *mode)
|
||||||
{
|
{
|
||||||
struct ocp_selector *tbl[] = { ptp_ocp_sma_in, ptp_ocp_sma_out };
|
|
||||||
int idx, count, dir;
|
int idx, count, dir;
|
||||||
char **argv;
|
char **argv;
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -2187,17 +2192,20 @@ ptp_ocp_sma_show(struct ptp_ocp *bp, int sma_nr, char *buf,
|
||||||
int default_in_val, int default_out_val)
|
int default_in_val, int default_out_val)
|
||||||
{
|
{
|
||||||
struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1];
|
struct ptp_ocp_sma_connector *sma = &bp->sma[sma_nr - 1];
|
||||||
|
struct ocp_selector **tbl;
|
||||||
u32 val;
|
u32 val;
|
||||||
|
|
||||||
|
tbl = ocp_sma_tbl[bp->sma_tbl];
|
||||||
|
|
||||||
val = ptp_ocp_sma_get(bp, sma_nr, sma->mode) & SMA_SELECT_MASK;
|
val = ptp_ocp_sma_get(bp, sma_nr, sma->mode) & SMA_SELECT_MASK;
|
||||||
|
|
||||||
if (sma->mode == SMA_MODE_IN) {
|
if (sma->mode == SMA_MODE_IN) {
|
||||||
if (sma->disabled)
|
if (sma->disabled)
|
||||||
val = SMA_DISABLE;
|
val = SMA_DISABLE;
|
||||||
return ptp_ocp_show_inputs(val, buf, default_in_val);
|
return ptp_ocp_show_inputs(tbl[0], val, buf, default_in_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ptp_ocp_show_output(val, buf, default_out_val);
|
return ptp_ocp_show_output(tbl[1], val, buf, default_out_val);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
|
@ -2288,7 +2296,7 @@ ptp_ocp_sma_store(struct ptp_ocp *bp, const char *buf, int sma_nr)
|
||||||
int val;
|
int val;
|
||||||
|
|
||||||
mode = sma->mode;
|
mode = sma->mode;
|
||||||
val = sma_parse_inputs(buf, &mode);
|
val = sma_parse_inputs(ocp_sma_tbl[bp->sma_tbl], buf, &mode);
|
||||||
if (val < 0)
|
if (val < 0)
|
||||||
return val;
|
return val;
|
||||||
|
|
||||||
|
@ -2377,7 +2385,9 @@ static ssize_t
|
||||||
available_sma_inputs_show(struct device *dev,
|
available_sma_inputs_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return ptp_ocp_select_table_show(ptp_ocp_sma_in, buf);
|
struct ptp_ocp *bp = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
return ptp_ocp_select_table_show(ocp_sma_tbl[bp->sma_tbl][0], buf);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(available_sma_inputs);
|
static DEVICE_ATTR_RO(available_sma_inputs);
|
||||||
|
|
||||||
|
@ -2385,7 +2395,9 @@ static ssize_t
|
||||||
available_sma_outputs_show(struct device *dev,
|
available_sma_outputs_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
return ptp_ocp_select_table_show(ptp_ocp_sma_out, buf);
|
struct ptp_ocp *bp = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
return ptp_ocp_select_table_show(ocp_sma_tbl[bp->sma_tbl][1], buf);
|
||||||
}
|
}
|
||||||
static DEVICE_ATTR_RO(available_sma_outputs);
|
static DEVICE_ATTR_RO(available_sma_outputs);
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue