in extcon.c [682:734]
int extcon_set_property(struct extcon_dev *edev, unsigned int id,
unsigned int prop,
union extcon_property_value prop_val)
{
struct extcon_cable *cable;
unsigned long flags;
int index, ret = 0;
if (!edev)
return -EINVAL;
/* Check whether the property is supported or not */
if (!is_extcon_property_supported(id, prop))
return -EINVAL;
/* Find the cable index of external connector by using id */
index = find_cable_index_by_id(edev, id);
if (index < 0)
return index;
spin_lock_irqsave(&edev->lock, flags);
/* Check whether the property is available or not. */
if (!is_extcon_property_capability(edev, id, index, prop)) {
spin_unlock_irqrestore(&edev->lock, flags);
return -EPERM;
}
cable = &edev->cables[index];
/* Set the property value according to extcon type */
switch (prop) {
case EXTCON_PROP_USB_MIN ... EXTCON_PROP_USB_MAX:
cable->usb_propval[prop - EXTCON_PROP_USB_MIN] = prop_val;
break;
case EXTCON_PROP_CHG_MIN ... EXTCON_PROP_CHG_MAX:
cable->chg_propval[prop - EXTCON_PROP_CHG_MIN] = prop_val;
break;
case EXTCON_PROP_JACK_MIN ... EXTCON_PROP_JACK_MAX:
cable->jack_propval[prop - EXTCON_PROP_JACK_MIN] = prop_val;
break;
case EXTCON_PROP_DISP_MIN ... EXTCON_PROP_DISP_MAX:
cable->disp_propval[prop - EXTCON_PROP_DISP_MIN] = prop_val;
break;
default:
ret = -EINVAL;
break;
}
spin_unlock_irqrestore(&edev->lock, flags);
return ret;
}