Lines Matching +full:mask +full:- +full:reset
2 * TI SYSCON regmap reset driver
4 * Copyright (C) 2015-2016 Texas Instruments Incorporated - https://www.ti.com/
23 #include <linux/reset-controller.h>
25 #include <dt-bindings/reset/ti-syscon.h>
28 * struct ti_syscon_reset_control - reset control structure
29 * @assert_offset: reset assert control register offset from syscon base
30 * @assert_bit: reset assert bit in the reset assert control register
31 * @deassert_offset: reset deassert control register offset from syscon base
32 * @deassert_bit: reset deassert bit in the reset deassert control register
33 * @status_offset: reset status register offset from syscon base
34 * @status_bit: reset status bit in the reset status register
35 * @flags: reset flag indicating how the (de)assert and status are handled
48 * struct ti_syscon_reset_data - reset controller information structure
49 * @rcdev: reset controller entity
50 * @regmap: regmap handle containing the memory-mapped reset registers
51 * @controls: array of reset controls
65 * ti_syscon_reset_assert() - assert device reset
66 * @rcdev: reset controller entity
67 * @id: ID of the reset to be asserted
69 * This function implements the reset driver op to assert a device's reset.
70 * This asserts the reset in a manner prescribed by the reset flags.
79 unsigned int mask, value; in ti_syscon_reset_assert() local
81 if (id >= data->nr_controls) in ti_syscon_reset_assert()
82 return -EINVAL; in ti_syscon_reset_assert()
84 control = &data->controls[id]; in ti_syscon_reset_assert()
86 if (control->flags & ASSERT_NONE) in ti_syscon_reset_assert()
87 return -ENOTSUPP; /* assert not supported for this reset */ in ti_syscon_reset_assert()
89 mask = BIT(control->assert_bit); in ti_syscon_reset_assert()
90 value = (control->flags & ASSERT_SET) ? mask : 0x0; in ti_syscon_reset_assert()
92 return regmap_update_bits(data->regmap, control->assert_offset, mask, value); in ti_syscon_reset_assert()
96 * ti_syscon_reset_deassert() - deassert device reset
97 * @rcdev: reset controller entity
98 * @id: ID of reset to be deasserted
100 * This function implements the reset driver op to deassert a device's reset.
101 * This deasserts the reset in a manner prescribed by the reset flags.
110 unsigned int mask, value; in ti_syscon_reset_deassert() local
112 if (id >= data->nr_controls) in ti_syscon_reset_deassert()
113 return -EINVAL; in ti_syscon_reset_deassert()
115 control = &data->controls[id]; in ti_syscon_reset_deassert()
117 if (control->flags & DEASSERT_NONE) in ti_syscon_reset_deassert()
118 return -ENOTSUPP; /* deassert not supported for this reset */ in ti_syscon_reset_deassert()
120 mask = BIT(control->deassert_bit); in ti_syscon_reset_deassert()
121 value = (control->flags & DEASSERT_SET) ? mask : 0x0; in ti_syscon_reset_deassert()
123 return regmap_update_bits(data->regmap, control->deassert_offset, mask, value); in ti_syscon_reset_deassert()
127 * ti_syscon_reset_status() - check device reset status
128 * @rcdev: reset controller entity
129 * @id: ID of the reset for which the status is being requested
131 * This function implements the reset driver op to return the status of a
132 * device's reset.
134 * Return: 0 if reset is deasserted, true if reset is asserted, else a
145 if (id >= data->nr_controls) in ti_syscon_reset_status()
146 return -EINVAL; in ti_syscon_reset_status()
148 control = &data->controls[id]; in ti_syscon_reset_status()
150 if (control->flags & STATUS_NONE) in ti_syscon_reset_status()
151 return -ENOTSUPP; /* status not supported for this reset */ in ti_syscon_reset_status()
153 ret = regmap_read(data->regmap, control->status_offset, &reset_state); in ti_syscon_reset_status()
157 return !(reset_state & BIT(control->status_bit)) == in ti_syscon_reset_status()
158 !(control->flags & STATUS_SET); in ti_syscon_reset_status()
169 struct device *dev = &pdev->dev; in ti_syscon_reset_probe()
170 struct device_node *np = dev->of_node; in ti_syscon_reset_probe()
179 return -ENOMEM; in ti_syscon_reset_probe()
181 regmap = syscon_node_to_regmap(np->parent); in ti_syscon_reset_probe()
185 list = of_get_property(np, "ti,reset-bits", &size); in ti_syscon_reset_probe()
187 dev_err(dev, "invalid DT reset description\n"); in ti_syscon_reset_probe()
188 return -EINVAL; in ti_syscon_reset_probe()
195 return -ENOMEM; in ti_syscon_reset_probe()
207 data->rcdev.ops = &ti_syscon_reset_ops; in ti_syscon_reset_probe()
208 data->rcdev.owner = THIS_MODULE; in ti_syscon_reset_probe()
209 data->rcdev.of_node = np; in ti_syscon_reset_probe()
210 data->rcdev.nr_resets = nr_controls; in ti_syscon_reset_probe()
211 data->regmap = regmap; in ti_syscon_reset_probe()
212 data->controls = controls; in ti_syscon_reset_probe()
213 data->nr_controls = nr_controls; in ti_syscon_reset_probe()
217 return devm_reset_controller_register(dev, &data->rcdev); in ti_syscon_reset_probe()
221 { .compatible = "ti,syscon-reset", },
229 .name = "ti-syscon-reset",
236 MODULE_AUTHOR("Suman Anna <s-anna@ti.com>");
237 MODULE_DESCRIPTION("TI SYSCON Regmap Reset Driver");