Loading drivers/gpio/qpnp-pin.c +40 −19 Original line number Diff line number Diff line Loading @@ -57,7 +57,9 @@ /* mpp peripheral type and subtype values */ #define Q_MPP_TYPE 0x11 #define Q_MPP_SUBTYPE_4CH_NO_ANA_OUT 0x3 #define Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT 0x4 #define Q_MPP_SUBTYPE_4CH_NO_SINK 0x5 #define Q_MPP_SUBTYPE_ULT_4CH_NO_SINK 0x6 #define Q_MPP_SUBTYPE_4CH_FULL_FUNC 0x7 #define Q_MPP_SUBTYPE_8CH_FULL_FUNC 0xF Loading Loading @@ -235,22 +237,29 @@ static inline void qpnp_chip_gpio_set_spec(struct qpnp_pin_chip *q_chip, static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, struct qpnp_pin_spec *q_spec, uint32_t val) { u8 subtype = q_spec->subtype; switch (idx) { case Q_PIN_CFG_MODE: if (q_spec->type == Q_GPIO_TYPE && val >= QPNP_PIN_GPIO_MODE_INVALID) return -EINVAL; else if (q_spec->type == Q_MPP_TYPE && val >= QPNP_PIN_MPP_MODE_INVALID) else if (q_spec->type == Q_MPP_TYPE) { if (val >= QPNP_PIN_MPP_MODE_INVALID) return -EINVAL; if ((subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK) && (val == QPNP_PIN_MODE_BIDIR)) return -ENXIO; } break; case Q_PIN_CFG_OUTPUT_TYPE: if (q_spec->type != Q_GPIO_TYPE) return -ENXIO; if ((val == QPNP_PIN_OUT_BUF_OPEN_DRAIN_NMOS || val == QPNP_PIN_OUT_BUF_OPEN_DRAIN_PMOS) && (q_spec->subtype == Q_GPIO_SUBTYPE_GPIOC_4CH || (q_spec->subtype == Q_GPIO_SUBTYPE_GPIOC_8CH))) (subtype == Q_GPIO_SUBTYPE_GPIOC_4CH || (subtype == Q_GPIO_SUBTYPE_GPIOC_8CH))) return -EINVAL; else if (val >= QPNP_PIN_OUT_BUF_INVALID) return -EINVAL; Loading @@ -263,22 +272,28 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, if (q_spec->type == Q_GPIO_TYPE && val >= QPNP_PIN_GPIO_PULL_INVALID) return -EINVAL; if (q_spec->type == Q_MPP_TYPE && val >= QPNP_PIN_MPP_PULL_INVALID) if (q_spec->type == Q_MPP_TYPE) { if (val >= QPNP_PIN_MPP_PULL_INVALID) return -EINVAL; if (subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK) return -ENXIO; } break; case Q_PIN_CFG_VIN_SEL: if (val >= QPNP_PIN_VIN_8CH_INVALID) return -EINVAL; else if (val >= QPNP_PIN_VIN_4CH_INVALID) { if (q_spec->type == Q_GPIO_TYPE && (q_spec->subtype == Q_GPIO_SUBTYPE_GPIO_4CH || q_spec->subtype == Q_GPIO_SUBTYPE_GPIOC_4CH)) (subtype == Q_GPIO_SUBTYPE_GPIO_4CH || subtype == Q_GPIO_SUBTYPE_GPIOC_4CH)) return -EINVAL; if (q_spec->type == Q_MPP_TYPE && (q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT || q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_SINK || q_spec->subtype == Q_MPP_SUBTYPE_4CH_FULL_FUNC)) (subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_4CH_NO_SINK || subtype == Q_MPP_SUBTYPE_4CH_FULL_FUNC || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK)) return -EINVAL; } break; Loading @@ -304,7 +319,8 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, case Q_PIN_CFG_AOUT_REF: if (q_spec->type != Q_MPP_TYPE) return -ENXIO; if (q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT) if (subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT) return -ENXIO; if (val >= QPNP_PIN_AOUT_REF_INVALID) return -EINVAL; Loading @@ -318,7 +334,8 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, case Q_PIN_CFG_CS_OUT: if (q_spec->type != Q_MPP_TYPE) return -ENXIO; if (q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_SINK) if (subtype == Q_MPP_SUBTYPE_4CH_NO_SINK || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK) return -ENXIO; if (val >= QPNP_PIN_CS_OUT_INVALID) return -EINVAL; Loading Loading @@ -410,9 +427,11 @@ static int qpnp_pin_ctl_regs_init(struct qpnp_pin_spec *q_spec) else if (q_spec->type == Q_MPP_TYPE) switch (q_spec->subtype) { case Q_MPP_SUBTYPE_4CH_NO_SINK: case Q_MPP_SUBTYPE_ULT_4CH_NO_SINK: q_spec->num_ctl_regs = 12; break; case Q_MPP_SUBTYPE_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_4CH_FULL_FUNC: case Q_MPP_SUBTYPE_8CH_FULL_FUNC: q_spec->num_ctl_regs = 13; Loading Loading @@ -1144,7 +1163,9 @@ static int qpnp_pin_is_valid_pin(struct qpnp_pin_spec *q_spec) else if (q_spec->type == Q_MPP_TYPE) switch (q_spec->subtype) { case Q_MPP_SUBTYPE_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_4CH_NO_SINK: case Q_MPP_SUBTYPE_ULT_4CH_NO_SINK: case Q_MPP_SUBTYPE_4CH_FULL_FUNC: case Q_MPP_SUBTYPE_8CH_FULL_FUNC: return 1; Loading Loading
drivers/gpio/qpnp-pin.c +40 −19 Original line number Diff line number Diff line Loading @@ -57,7 +57,9 @@ /* mpp peripheral type and subtype values */ #define Q_MPP_TYPE 0x11 #define Q_MPP_SUBTYPE_4CH_NO_ANA_OUT 0x3 #define Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT 0x4 #define Q_MPP_SUBTYPE_4CH_NO_SINK 0x5 #define Q_MPP_SUBTYPE_ULT_4CH_NO_SINK 0x6 #define Q_MPP_SUBTYPE_4CH_FULL_FUNC 0x7 #define Q_MPP_SUBTYPE_8CH_FULL_FUNC 0xF Loading Loading @@ -235,22 +237,29 @@ static inline void qpnp_chip_gpio_set_spec(struct qpnp_pin_chip *q_chip, static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, struct qpnp_pin_spec *q_spec, uint32_t val) { u8 subtype = q_spec->subtype; switch (idx) { case Q_PIN_CFG_MODE: if (q_spec->type == Q_GPIO_TYPE && val >= QPNP_PIN_GPIO_MODE_INVALID) return -EINVAL; else if (q_spec->type == Q_MPP_TYPE && val >= QPNP_PIN_MPP_MODE_INVALID) else if (q_spec->type == Q_MPP_TYPE) { if (val >= QPNP_PIN_MPP_MODE_INVALID) return -EINVAL; if ((subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK) && (val == QPNP_PIN_MODE_BIDIR)) return -ENXIO; } break; case Q_PIN_CFG_OUTPUT_TYPE: if (q_spec->type != Q_GPIO_TYPE) return -ENXIO; if ((val == QPNP_PIN_OUT_BUF_OPEN_DRAIN_NMOS || val == QPNP_PIN_OUT_BUF_OPEN_DRAIN_PMOS) && (q_spec->subtype == Q_GPIO_SUBTYPE_GPIOC_4CH || (q_spec->subtype == Q_GPIO_SUBTYPE_GPIOC_8CH))) (subtype == Q_GPIO_SUBTYPE_GPIOC_4CH || (subtype == Q_GPIO_SUBTYPE_GPIOC_8CH))) return -EINVAL; else if (val >= QPNP_PIN_OUT_BUF_INVALID) return -EINVAL; Loading @@ -263,22 +272,28 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, if (q_spec->type == Q_GPIO_TYPE && val >= QPNP_PIN_GPIO_PULL_INVALID) return -EINVAL; if (q_spec->type == Q_MPP_TYPE && val >= QPNP_PIN_MPP_PULL_INVALID) if (q_spec->type == Q_MPP_TYPE) { if (val >= QPNP_PIN_MPP_PULL_INVALID) return -EINVAL; if (subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK) return -ENXIO; } break; case Q_PIN_CFG_VIN_SEL: if (val >= QPNP_PIN_VIN_8CH_INVALID) return -EINVAL; else if (val >= QPNP_PIN_VIN_4CH_INVALID) { if (q_spec->type == Q_GPIO_TYPE && (q_spec->subtype == Q_GPIO_SUBTYPE_GPIO_4CH || q_spec->subtype == Q_GPIO_SUBTYPE_GPIOC_4CH)) (subtype == Q_GPIO_SUBTYPE_GPIO_4CH || subtype == Q_GPIO_SUBTYPE_GPIOC_4CH)) return -EINVAL; if (q_spec->type == Q_MPP_TYPE && (q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT || q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_SINK || q_spec->subtype == Q_MPP_SUBTYPE_4CH_FULL_FUNC)) (subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_4CH_NO_SINK || subtype == Q_MPP_SUBTYPE_4CH_FULL_FUNC || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK)) return -EINVAL; } break; Loading @@ -304,7 +319,8 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, case Q_PIN_CFG_AOUT_REF: if (q_spec->type != Q_MPP_TYPE) return -ENXIO; if (q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT) if (subtype == Q_MPP_SUBTYPE_4CH_NO_ANA_OUT || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT) return -ENXIO; if (val >= QPNP_PIN_AOUT_REF_INVALID) return -EINVAL; Loading @@ -318,7 +334,8 @@ static int qpnp_pin_check_config(enum qpnp_pin_param_type idx, case Q_PIN_CFG_CS_OUT: if (q_spec->type != Q_MPP_TYPE) return -ENXIO; if (q_spec->subtype == Q_MPP_SUBTYPE_4CH_NO_SINK) if (subtype == Q_MPP_SUBTYPE_4CH_NO_SINK || subtype == Q_MPP_SUBTYPE_ULT_4CH_NO_SINK) return -ENXIO; if (val >= QPNP_PIN_CS_OUT_INVALID) return -EINVAL; Loading Loading @@ -410,9 +427,11 @@ static int qpnp_pin_ctl_regs_init(struct qpnp_pin_spec *q_spec) else if (q_spec->type == Q_MPP_TYPE) switch (q_spec->subtype) { case Q_MPP_SUBTYPE_4CH_NO_SINK: case Q_MPP_SUBTYPE_ULT_4CH_NO_SINK: q_spec->num_ctl_regs = 12; break; case Q_MPP_SUBTYPE_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_4CH_FULL_FUNC: case Q_MPP_SUBTYPE_8CH_FULL_FUNC: q_spec->num_ctl_regs = 13; Loading Loading @@ -1144,7 +1163,9 @@ static int qpnp_pin_is_valid_pin(struct qpnp_pin_spec *q_spec) else if (q_spec->type == Q_MPP_TYPE) switch (q_spec->subtype) { case Q_MPP_SUBTYPE_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_ULT_4CH_NO_ANA_OUT: case Q_MPP_SUBTYPE_4CH_NO_SINK: case Q_MPP_SUBTYPE_ULT_4CH_NO_SINK: case Q_MPP_SUBTYPE_4CH_FULL_FUNC: case Q_MPP_SUBTYPE_8CH_FULL_FUNC: return 1; Loading