Lines Matching refs:jzpc

137 	struct ingenic_pinctrl *jzpc;  member
159 is_soc_or_above(const struct ingenic_pinctrl *jzpc, enum jz_version version) in is_soc_or_above() argument
163 || jzpc->info->version >= version); in is_soc_or_above()
3261 regmap_read(jzgc->jzpc->map, jzgc->reg_base + reg, &val); in ingenic_gpio_read_reg()
3269 if (!is_soc_or_above(jzgc->jzpc, ID_JZ4740)) { in ingenic_gpio_set_bit()
3270 regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg, in ingenic_gpio_set_bit()
3280 regmap_write(jzgc->jzpc->map, jzgc->reg_base + reg, BIT(offset)); in ingenic_gpio_set_bit()
3291 regmap_write(jzgc->jzpc->map, REG_PZ_BASE( in ingenic_gpio_shadow_set_bit()
3292 jzgc->jzpc->info->reg_offset) + reg, BIT(offset)); in ingenic_gpio_shadow_set_bit()
3297 regmap_write(jzgc->jzpc->map, REG_PZ_GID2LD( in ingenic_gpio_shadow_set_bit_load()
3298 jzgc->jzpc->info->reg_offset), in ingenic_gpio_shadow_set_bit_load()
3313 regmap_update_bits(jzgc->jzpc->map, jzgc->reg_base + reg, mask, value << (idx * 2)); in jz4730_gpio_set_bits()
3327 if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) in ingenic_gpio_set_value()
3329 else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_set_value()
3364 if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) { in irq_set_type()
3367 } else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) { in irq_set_type()
3377 if (is_soc_or_above(jzgc->jzpc, ID_X2000)) { in irq_set_type()
3382 } else if (is_soc_or_above(jzgc->jzpc, ID_X1000)) { in irq_set_type()
3398 if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_irq_mask()
3410 if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_irq_unmask()
3424 if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) in ingenic_gpio_irq_enable()
3426 else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_irq_enable()
3442 if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) in ingenic_gpio_irq_disable()
3444 else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_irq_disable()
3460 !is_soc_or_above(jzgc->jzpc, ID_X2000)) { in ingenic_gpio_irq_ack()
3472 if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) in ingenic_gpio_irq_ack()
3474 else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_irq_ack()
3500 if ((type == IRQ_TYPE_EDGE_BOTH) && !is_soc_or_above(jzgc->jzpc, ID_X2000)) { in ingenic_gpio_irq_set_type()
3532 if (is_soc_or_above(jzgc->jzpc, ID_JZ4770)) in ingenic_gpio_irq_handler()
3534 else if (is_soc_or_above(jzgc->jzpc, ID_JZ4740)) in ingenic_gpio_irq_handler()
3572 static inline void ingenic_config_pin(struct ingenic_pinctrl *jzpc, in ingenic_config_pin() argument
3579 if (is_soc_or_above(jzpc, ID_JZ4740)) in ingenic_config_pin()
3580 regmap_write(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_config_pin()
3583 regmap_set_bits(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_config_pin()
3586 if (is_soc_or_above(jzpc, ID_JZ4740)) in ingenic_config_pin()
3587 regmap_write(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_config_pin()
3590 regmap_clear_bits(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_config_pin()
3595 static inline void ingenic_shadow_config_pin(struct ingenic_pinctrl *jzpc, in ingenic_shadow_config_pin() argument
3600 regmap_write(jzpc->map, REG_PZ_BASE(jzpc->info->reg_offset) + in ingenic_shadow_config_pin()
3604 static inline void ingenic_shadow_config_pin_load(struct ingenic_pinctrl *jzpc, in ingenic_shadow_config_pin_load() argument
3607 regmap_write(jzpc->map, REG_PZ_GID2LD(jzpc->info->reg_offset), in ingenic_shadow_config_pin_load()
3611 static inline void jz4730_config_pin_function(struct ingenic_pinctrl *jzpc, in jz4730_config_pin_function() argument
3623 regmap_update_bits(jzpc->map, offt * jzpc->info->reg_offset + reg, in jz4730_config_pin_function()
3627 static inline bool ingenic_get_pin_config(struct ingenic_pinctrl *jzpc, in ingenic_get_pin_config() argument
3634 regmap_read(jzpc->map, offt * jzpc->info->reg_offset + reg, &val); in ingenic_get_pin_config()
3642 struct ingenic_pinctrl *jzpc = jzgc->jzpc; in ingenic_gpio_get_direction() local
3645 if (is_soc_or_above(jzpc, ID_JZ4770)) { in ingenic_gpio_get_direction()
3646 if (ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_INT) || in ingenic_gpio_get_direction()
3647 ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PAT1)) in ingenic_gpio_get_direction()
3650 } else if (!is_soc_or_above(jzpc, ID_JZ4740)) { in ingenic_gpio_get_direction()
3651 if (!ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPDIR)) in ingenic_gpio_get_direction()
3656 if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_SELECT)) in ingenic_gpio_get_direction()
3659 if (ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_DIR)) in ingenic_gpio_get_direction()
3715 static int ingenic_pinmux_set_pin_fn(struct ingenic_pinctrl *jzpc, in ingenic_pinmux_set_pin_fn() argument
3721 dev_dbg(jzpc->dev, "set pin P%c%u to function %u\n", in ingenic_pinmux_set_pin_fn()
3724 if (is_soc_or_above(jzpc, ID_X1000)) { in ingenic_pinmux_set_pin_fn()
3725 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); in ingenic_pinmux_set_pin_fn()
3726 ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, false); in ingenic_pinmux_set_pin_fn()
3727 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2); in ingenic_pinmux_set_pin_fn()
3728 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1); in ingenic_pinmux_set_pin_fn()
3729 ingenic_shadow_config_pin_load(jzpc, pin); in ingenic_pinmux_set_pin_fn()
3730 } else if (is_soc_or_above(jzpc, ID_JZ4770)) { in ingenic_pinmux_set_pin_fn()
3731 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); in ingenic_pinmux_set_pin_fn()
3732 ingenic_config_pin(jzpc, pin, GPIO_MSK, false); in ingenic_pinmux_set_pin_fn()
3733 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, func & 0x2); in ingenic_pinmux_set_pin_fn()
3734 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, func & 0x1); in ingenic_pinmux_set_pin_fn()
3735 } else if (is_soc_or_above(jzpc, ID_JZ4740)) { in ingenic_pinmux_set_pin_fn()
3736 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, true); in ingenic_pinmux_set_pin_fn()
3737 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_TRIG, func & 0x2); in ingenic_pinmux_set_pin_fn()
3738 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, func & 0x1); in ingenic_pinmux_set_pin_fn()
3740 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false); in ingenic_pinmux_set_pin_fn()
3741 jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, func); in ingenic_pinmux_set_pin_fn()
3750 struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); in ingenic_pinmux_set_mux() local
3771 ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], mode); in ingenic_pinmux_set_mux()
3776 ingenic_pinmux_set_pin_fn(jzpc, grp->pins[i], pin_modes[i]); in ingenic_pinmux_set_mux()
3786 struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); in ingenic_pinmux_gpio_set_direction() local
3793 if (is_soc_or_above(jzpc, ID_X1000)) { in ingenic_pinmux_gpio_set_direction()
3794 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); in ingenic_pinmux_gpio_set_direction()
3795 ingenic_shadow_config_pin(jzpc, pin, GPIO_MSK, true); in ingenic_pinmux_gpio_set_direction()
3796 ingenic_shadow_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input); in ingenic_pinmux_gpio_set_direction()
3797 ingenic_shadow_config_pin_load(jzpc, pin); in ingenic_pinmux_gpio_set_direction()
3798 } else if (is_soc_or_above(jzpc, ID_JZ4770)) { in ingenic_pinmux_gpio_set_direction()
3799 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_INT, false); in ingenic_pinmux_gpio_set_direction()
3800 ingenic_config_pin(jzpc, pin, GPIO_MSK, true); in ingenic_pinmux_gpio_set_direction()
3801 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT1, input); in ingenic_pinmux_gpio_set_direction()
3802 } else if (is_soc_or_above(jzpc, ID_JZ4740)) { in ingenic_pinmux_gpio_set_direction()
3803 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_SELECT, false); in ingenic_pinmux_gpio_set_direction()
3804 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DIR, !input); in ingenic_pinmux_gpio_set_direction()
3805 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_FUNC, false); in ingenic_pinmux_gpio_set_direction()
3807 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPIER, false); in ingenic_pinmux_gpio_set_direction()
3808 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPDIR, !input); in ingenic_pinmux_gpio_set_direction()
3809 jz4730_config_pin_function(jzpc, pin, JZ4730_GPIO_GPAUR, JZ4730_GPIO_GPALR, 0); in ingenic_pinmux_gpio_set_direction()
3826 struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); in ingenic_pinconf_get() local
3834 if (is_soc_or_above(jzpc, ID_X2000)) { in ingenic_pinconf_get()
3835 pullup = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) && in ingenic_pinconf_get()
3836 !ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) && in ingenic_pinconf_get()
3837 (jzpc->info->pull_ups[offt] & BIT(idx)); in ingenic_pinconf_get()
3838 pulldown = ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPD) && in ingenic_pinconf_get()
3839 !ingenic_get_pin_config(jzpc, pin, X2000_GPIO_PEPU) && in ingenic_pinconf_get()
3840 (jzpc->info->pull_downs[offt] & BIT(idx)); in ingenic_pinconf_get()
3842 } else if (is_soc_or_above(jzpc, ID_X1830)) { in ingenic_pinconf_get()
3847 regmap_read(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_pinconf_get()
3850 regmap_read(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_pinconf_get()
3855 pullup = (bias == GPIO_PULL_UP) && (jzpc->info->pull_ups[offt] & BIT(idx)); in ingenic_pinconf_get()
3856 pulldown = (bias == GPIO_PULL_DOWN) && (jzpc->info->pull_downs[offt] & BIT(idx)); in ingenic_pinconf_get()
3859 if (is_soc_or_above(jzpc, ID_JZ4770)) in ingenic_pinconf_get()
3860 pull = !ingenic_get_pin_config(jzpc, pin, JZ4770_GPIO_PEN); in ingenic_pinconf_get()
3861 else if (is_soc_or_above(jzpc, ID_JZ4740)) in ingenic_pinconf_get()
3862 pull = !ingenic_get_pin_config(jzpc, pin, JZ4740_GPIO_PULL_DIS); in ingenic_pinconf_get()
3864 pull = ingenic_get_pin_config(jzpc, pin, JZ4730_GPIO_GPPUR); in ingenic_pinconf_get()
3866 pullup = pull && (jzpc->info->pull_ups[offt] & BIT(idx)); in ingenic_pinconf_get()
3867 pulldown = pull && (jzpc->info->pull_downs[offt] & BIT(idx)); in ingenic_pinconf_get()
3890 if (is_soc_or_above(jzpc, ID_X2000)) in ingenic_pinconf_get()
3892 else if (is_soc_or_above(jzpc, ID_X1830)) in ingenic_pinconf_get()
3897 arg = !!ingenic_get_pin_config(jzpc, pin, reg); in ingenic_pinconf_get()
3901 if (is_soc_or_above(jzpc, ID_X2000)) in ingenic_pinconf_get()
3903 else if (is_soc_or_above(jzpc, ID_X1830)) in ingenic_pinconf_get()
3908 arg = !!ingenic_get_pin_config(jzpc, pin, reg); in ingenic_pinconf_get()
3919 static void ingenic_set_bias(struct ingenic_pinctrl *jzpc, in ingenic_set_bias() argument
3922 if (is_soc_or_above(jzpc, ID_X2000)) { in ingenic_set_bias()
3925 ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false); in ingenic_set_bias()
3926 ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, true); in ingenic_set_bias()
3930 ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false); in ingenic_set_bias()
3931 ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, true); in ingenic_set_bias()
3936 ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPU, false); in ingenic_set_bias()
3937 ingenic_config_pin(jzpc, pin, X2000_GPIO_PEPD, false); in ingenic_set_bias()
3940 } else if (is_soc_or_above(jzpc, ID_X1830)) { in ingenic_set_bias()
3947 regmap_write(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_set_bias()
3949 regmap_write(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_set_bias()
3952 regmap_write(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_set_bias()
3954 regmap_write(jzpc->map, offt * jzpc->info->reg_offset + in ingenic_set_bias()
3958 } else if (is_soc_or_above(jzpc, ID_JZ4770)) { in ingenic_set_bias()
3959 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PEN, !bias); in ingenic_set_bias()
3960 } else if (is_soc_or_above(jzpc, ID_JZ4740)) { in ingenic_set_bias()
3961 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_PULL_DIS, !bias); in ingenic_set_bias()
3963 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_GPPUR, bias); in ingenic_set_bias()
3967 static void ingenic_set_schmitt_trigger(struct ingenic_pinctrl *jzpc, in ingenic_set_schmitt_trigger() argument
3970 if (is_soc_or_above(jzpc, ID_X2000)) in ingenic_set_schmitt_trigger()
3971 ingenic_config_pin(jzpc, pin, X2000_GPIO_SMT, enable); in ingenic_set_schmitt_trigger()
3973 ingenic_config_pin(jzpc, pin, X1830_GPIO_SMT, enable); in ingenic_set_schmitt_trigger()
3976 static void ingenic_set_output_level(struct ingenic_pinctrl *jzpc, in ingenic_set_output_level() argument
3979 if (is_soc_or_above(jzpc, ID_JZ4770)) in ingenic_set_output_level()
3980 ingenic_config_pin(jzpc, pin, JZ4770_GPIO_PAT0, high); in ingenic_set_output_level()
3981 else if (is_soc_or_above(jzpc, ID_JZ4740)) in ingenic_set_output_level()
3982 ingenic_config_pin(jzpc, pin, JZ4740_GPIO_DATA, high); in ingenic_set_output_level()
3984 ingenic_config_pin(jzpc, pin, JZ4730_GPIO_DATA, high); in ingenic_set_output_level()
3987 static void ingenic_set_slew_rate(struct ingenic_pinctrl *jzpc, in ingenic_set_slew_rate() argument
3990 if (is_soc_or_above(jzpc, ID_X2000)) in ingenic_set_slew_rate()
3991 ingenic_config_pin(jzpc, pin, X2000_GPIO_SR, slew); in ingenic_set_slew_rate()
3993 ingenic_config_pin(jzpc, pin, X1830_GPIO_SR, slew); in ingenic_set_slew_rate()
3999 struct ingenic_pinctrl *jzpc = pinctrl_dev_get_drvdata(pctldev); in ingenic_pinconf_set() local
4024 dev_dbg(jzpc->dev, "disable pull-over for pin P%c%u\n", in ingenic_pinconf_set()
4026 ingenic_set_bias(jzpc, pin, GPIO_PULL_DIS); in ingenic_pinconf_set()
4030 if (!(jzpc->info->pull_ups[offt] & BIT(idx))) in ingenic_pinconf_set()
4032 dev_dbg(jzpc->dev, "set pull-up for pin P%c%u\n", in ingenic_pinconf_set()
4034 ingenic_set_bias(jzpc, pin, GPIO_PULL_UP); in ingenic_pinconf_set()
4038 if (!(jzpc->info->pull_downs[offt] & BIT(idx))) in ingenic_pinconf_set()
4040 dev_dbg(jzpc->dev, "set pull-down for pin P%c%u\n", in ingenic_pinconf_set()
4042 ingenic_set_bias(jzpc, pin, GPIO_PULL_DOWN); in ingenic_pinconf_set()
4046 if (!is_soc_or_above(jzpc, ID_X1830)) in ingenic_pinconf_set()
4049 ingenic_set_schmitt_trigger(jzpc, pin, arg); in ingenic_pinconf_set()
4057 ingenic_set_output_level(jzpc, pin, arg); in ingenic_pinconf_set()
4061 if (!is_soc_or_above(jzpc, ID_X1830)) in ingenic_pinconf_set()
4064 ingenic_set_slew_rate(jzpc, pin, arg); in ingenic_pinconf_set()
4154 static int __init ingenic_gpio_probe(struct ingenic_pinctrl *jzpc, in ingenic_gpio_probe() argument
4158 struct device *dev = jzpc->dev; in ingenic_gpio_probe()
4173 jzgc->jzpc = jzpc; in ingenic_gpio_probe()
4174 jzgc->reg_base = bank * jzpc->info->reg_offset; in ingenic_gpio_probe()
4229 struct ingenic_pinctrl *jzpc; in ingenic_pinctrl_probe() local
4244 jzpc = devm_kzalloc(dev, sizeof(*jzpc), GFP_KERNEL); in ingenic_pinctrl_probe()
4245 if (!jzpc) in ingenic_pinctrl_probe()
4260 jzpc->map = devm_regmap_init_mmio(dev, base, &regmap_config); in ingenic_pinctrl_probe()
4261 if (IS_ERR(jzpc->map)) { in ingenic_pinctrl_probe()
4263 return PTR_ERR(jzpc->map); in ingenic_pinctrl_probe()
4266 jzpc->dev = dev; in ingenic_pinctrl_probe()
4267 jzpc->info = chip_info; in ingenic_pinctrl_probe()
4280 pctl_desc->pins = jzpc->pdesc = devm_kcalloc(&pdev->dev, in ingenic_pinctrl_probe()
4281 pctl_desc->npins, sizeof(*jzpc->pdesc), GFP_KERNEL); in ingenic_pinctrl_probe()
4282 if (!jzpc->pdesc) in ingenic_pinctrl_probe()
4286 jzpc->pdesc[i].number = i; in ingenic_pinctrl_probe()
4287 jzpc->pdesc[i].name = kasprintf(GFP_KERNEL, "P%c%d", in ingenic_pinctrl_probe()
4292 jzpc->pctl = devm_pinctrl_register(dev, pctl_desc, jzpc); in ingenic_pinctrl_probe()
4293 if (IS_ERR(jzpc->pctl)) { in ingenic_pinctrl_probe()
4295 return PTR_ERR(jzpc->pctl); in ingenic_pinctrl_probe()
4301 err = pinctrl_generic_add_group(jzpc->pctl, group->name, in ingenic_pinctrl_probe()
4313 err = pinmux_generic_add_function(jzpc->pctl, func->name, in ingenic_pinctrl_probe()
4323 dev_set_drvdata(dev, jzpc->map); in ingenic_pinctrl_probe()
4327 err = ingenic_gpio_probe(jzpc, fwnode); in ingenic_pinctrl_probe()