Commit aa56a7ff authored by Jonathan Lemon's avatar Jonathan Lemon Committed by Jakub Kicinski

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: default avatarJonathan Lemon <jonathan.lemon@gmail.com>
Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 5a728ac5
...@@ -321,6 +321,7 @@ struct ptp_ocp { ...@@ -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[] = { ...@@ -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) ...@@ -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) ...@@ -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, ...@@ -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) ...@@ -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 ...@@ -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 ...@@ -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);
......
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