xpp: FXS: atomic vbat_h power handling
* In do_chan_power() make vbat_h changes atomic. * As a result we can ignore duplicate requests. This will allow cleaner logic in the next commit. * Added proper debug messages. Signed-off-by: Oron Peled <oron.peled@xorcom.com> Acked-by: Tzafrir Cohen <tzafrir.cohen@xorcom.com> git-svn-id: http://svn.asterisk.org/svn/dahdi/linux/trunk@10573 a0bf4364-ded3-4de4-8d8a-66a801d63aff
This commit is contained in:
parent
3e1c317323
commit
8aad29e4de
@ -183,15 +183,23 @@ struct FXS_priv_data {
|
|||||||
static int do_chan_power(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on)
|
static int do_chan_power(xbus_t *xbus, xpd_t *xpd, lineno_t chan, bool on)
|
||||||
{
|
{
|
||||||
struct FXS_priv_data *priv;
|
struct FXS_priv_data *priv;
|
||||||
|
unsigned long *p;
|
||||||
|
int was;
|
||||||
|
|
||||||
BUG_ON(!xbus);
|
BUG_ON(!xbus);
|
||||||
BUG_ON(!xpd);
|
BUG_ON(!xpd);
|
||||||
priv = xpd->priv;
|
priv = xpd->priv;
|
||||||
LINE_DBG(SIGNAL, xpd, chan, "%s\n", (on) ? "up" : "down");
|
p = (unsigned long *)&priv->vbat_h;
|
||||||
if (on)
|
if (on)
|
||||||
BIT_SET(priv->vbat_h, chan);
|
was = test_and_set_bit(chan, p) != 0;
|
||||||
else
|
else
|
||||||
BIT_CLR(priv->vbat_h, chan);
|
was = test_and_clear_bit(chan, p) != 0;
|
||||||
|
if (was == on) {
|
||||||
|
LINE_DBG(SIGNAL, xpd, chan,
|
||||||
|
"%s (same, ignored)\n", (on) ? "up" : "down");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
LINE_DBG(SIGNAL, xpd, chan, "%s\n", (on) ? "up" : "down");
|
||||||
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, REG_BATTERY,
|
return SLIC_DIRECT_REQUEST(xbus, xpd, chan, SLIC_WRITE, REG_BATTERY,
|
||||||
(on) ? REG_BATTERY_BATSL : 0x00);
|
(on) ? REG_BATTERY_BATSL : 0x00);
|
||||||
}
|
}
|
||||||
@ -1728,7 +1736,7 @@ static int proc_fxs_info_read(char *page, char **start, off_t off, int count,
|
|||||||
len += sprintf(page + len, "\n%-12s", "vbat_h:");
|
len += sprintf(page + len, "\n%-12s", "vbat_h:");
|
||||||
for_each_line(xpd, i) {
|
for_each_line(xpd, i) {
|
||||||
len += sprintf(page + len, "%4d",
|
len += sprintf(page + len, "%4d",
|
||||||
IS_SET(priv->vbat_h, i));
|
test_bit(i, (unsigned long *)&priv->vbat_h));
|
||||||
}
|
}
|
||||||
len += sprintf(page + len, "\n");
|
len += sprintf(page + len, "\n");
|
||||||
for (led = 0; led < NUM_LEDS; led++) {
|
for (led = 0; led < NUM_LEDS; led++) {
|
||||||
|
Loading…
Reference in New Issue
Block a user