1584861ffSPatrice Chotard /* 2584861ffSPatrice Chotard * Copyright (c) 2017 3584861ffSPatrice Chotard * Patrice Chotard <patrice.chotard@st.com> 4584861ffSPatrice Chotard * 5584861ffSPatrice Chotard * SPDX-License-Identifier: GPL-2.0+ 6584861ffSPatrice Chotard */ 7584861ffSPatrice Chotard 8584861ffSPatrice Chotard #include <common.h> 9584861ffSPatrice Chotard #include <errno.h> 10584861ffSPatrice Chotard #include <wait_bit.h> 11584861ffSPatrice Chotard #include <dm.h> 12584861ffSPatrice Chotard #include <reset-uclass.h> 13584861ffSPatrice Chotard #include <regmap.h> 14584861ffSPatrice Chotard #include <syscon.h> 15584861ffSPatrice Chotard #include <dt-bindings/reset/stih407-resets.h> 16584861ffSPatrice Chotard 17584861ffSPatrice Chotard DECLARE_GLOBAL_DATA_PTR; 18584861ffSPatrice Chotard 19584861ffSPatrice Chotard struct sti_reset { 20584861ffSPatrice Chotard const struct syscfg_reset_controller_data *data; 21584861ffSPatrice Chotard }; 22584861ffSPatrice Chotard 23584861ffSPatrice Chotard /** 24584861ffSPatrice Chotard * Reset channel description for a system configuration register based 25584861ffSPatrice Chotard * reset controller. 26584861ffSPatrice Chotard * 27584861ffSPatrice Chotard * @compatible: Compatible string of the syscon containing this 28584861ffSPatrice Chotard * channel's control and ack (status) bits. 29584861ffSPatrice Chotard * @reset_offset: Reset register offset in sysconf bank. 30584861ffSPatrice Chotard * @reset_bit: Bit number in reset register. 31584861ffSPatrice Chotard * @ack_offset: Ack reset register offset in syscon bank. 32584861ffSPatrice Chotard * @ack_bit: Bit number in Ack reset register. 33aef5b738SPatrice Chotard * @deassert_cnt: incremented when reset is deasserted, reset can only be 34aef5b738SPatrice Chotard * asserted when equal to 0 35584861ffSPatrice Chotard */ 36584861ffSPatrice Chotard 37584861ffSPatrice Chotard struct syscfg_reset_channel_data { 38584861ffSPatrice Chotard const char *compatible; 39584861ffSPatrice Chotard int reset_offset; 40584861ffSPatrice Chotard int reset_bit; 41584861ffSPatrice Chotard int ack_offset; 42584861ffSPatrice Chotard int ack_bit; 43aef5b738SPatrice Chotard int deassert_cnt; 44584861ffSPatrice Chotard }; 45584861ffSPatrice Chotard 46584861ffSPatrice Chotard /** 47584861ffSPatrice Chotard * Description of a system configuration register based reset controller. 48584861ffSPatrice Chotard * 49584861ffSPatrice Chotard * @wait_for_ack: The controller will wait for reset assert and de-assert to 50584861ffSPatrice Chotard * be "ack'd" in a channel's ack field. 51584861ffSPatrice Chotard * @active_low: Are the resets in this controller active low, i.e. clearing 52584861ffSPatrice Chotard * the reset bit puts the hardware into reset. 53584861ffSPatrice Chotard * @nr_channels: The number of reset channels in this controller. 54584861ffSPatrice Chotard * @channels: An array of reset channel descriptions. 55584861ffSPatrice Chotard */ 56584861ffSPatrice Chotard struct syscfg_reset_controller_data { 57584861ffSPatrice Chotard bool wait_for_ack; 58584861ffSPatrice Chotard bool active_low; 59584861ffSPatrice Chotard int nr_channels; 60aef5b738SPatrice Chotard struct syscfg_reset_channel_data *channels; 61584861ffSPatrice Chotard }; 62584861ffSPatrice Chotard 63584861ffSPatrice Chotard /* STiH407 Peripheral powerdown definitions. */ 64584861ffSPatrice Chotard static const char stih407_core[] = "st,stih407-core-syscfg"; 65584861ffSPatrice Chotard static const char stih407_sbc_reg[] = "st,stih407-sbc-reg-syscfg"; 66584861ffSPatrice Chotard static const char stih407_lpm[] = "st,stih407-lpm-syscfg"; 67584861ffSPatrice Chotard 68584861ffSPatrice Chotard #define _SYSCFG_RST_CH(_c, _rr, _rb, _ar, _ab) \ 69584861ffSPatrice Chotard { .compatible = _c, \ 70584861ffSPatrice Chotard .reset_offset = _rr, \ 71584861ffSPatrice Chotard .reset_bit = _rb, \ 72584861ffSPatrice Chotard .ack_offset = _ar, \ 73584861ffSPatrice Chotard .ack_bit = _ab, } 74584861ffSPatrice Chotard 75584861ffSPatrice Chotard #define _SYSCFG_RST_CH_NO_ACK(_c, _rr, _rb) \ 76584861ffSPatrice Chotard { .compatible = _c, \ 77584861ffSPatrice Chotard .reset_offset = _rr, \ 78584861ffSPatrice Chotard .reset_bit = _rb, } 79584861ffSPatrice Chotard 80584861ffSPatrice Chotard #define STIH407_SRST_CORE(_reg, _bit) \ 81584861ffSPatrice Chotard _SYSCFG_RST_CH_NO_ACK(stih407_core, _reg, _bit) 82584861ffSPatrice Chotard 83584861ffSPatrice Chotard #define STIH407_SRST_SBC(_reg, _bit) \ 84584861ffSPatrice Chotard _SYSCFG_RST_CH_NO_ACK(stih407_sbc_reg, _reg, _bit) 85584861ffSPatrice Chotard 86584861ffSPatrice Chotard #define STIH407_SRST_LPM(_reg, _bit) \ 87584861ffSPatrice Chotard _SYSCFG_RST_CH_NO_ACK(stih407_lpm, _reg, _bit) 88584861ffSPatrice Chotard 89584861ffSPatrice Chotard #define STIH407_PDN_0(_bit) \ 90584861ffSPatrice Chotard _SYSCFG_RST_CH(stih407_core, SYSCFG_5000, _bit, SYSSTAT_5500, _bit) 91584861ffSPatrice Chotard #define STIH407_PDN_1(_bit) \ 92584861ffSPatrice Chotard _SYSCFG_RST_CH(stih407_core, SYSCFG_5001, _bit, SYSSTAT_5501, _bit) 93584861ffSPatrice Chotard #define STIH407_PDN_ETH(_bit, _stat) \ 94584861ffSPatrice Chotard _SYSCFG_RST_CH(stih407_sbc_reg, SYSCFG_4032, _bit, SYSSTAT_4520, _stat) 95584861ffSPatrice Chotard 96584861ffSPatrice Chotard /* Powerdown requests control 0 */ 97584861ffSPatrice Chotard #define SYSCFG_5000 0x0 98584861ffSPatrice Chotard #define SYSSTAT_5500 0x7d0 99584861ffSPatrice Chotard /* Powerdown requests control 1 (High Speed Links) */ 100584861ffSPatrice Chotard #define SYSCFG_5001 0x4 101584861ffSPatrice Chotard #define SYSSTAT_5501 0x7d4 102584861ffSPatrice Chotard 103584861ffSPatrice Chotard /* Ethernet powerdown/status/reset */ 104584861ffSPatrice Chotard #define SYSCFG_4032 0x80 105584861ffSPatrice Chotard #define SYSSTAT_4520 0x820 106584861ffSPatrice Chotard #define SYSCFG_4002 0x8 107584861ffSPatrice Chotard 108aef5b738SPatrice Chotard static struct syscfg_reset_channel_data stih407_powerdowns[] = { 109584861ffSPatrice Chotard [STIH407_EMISS_POWERDOWN] = STIH407_PDN_0(1), 110584861ffSPatrice Chotard [STIH407_NAND_POWERDOWN] = STIH407_PDN_0(0), 111584861ffSPatrice Chotard [STIH407_USB3_POWERDOWN] = STIH407_PDN_1(6), 112584861ffSPatrice Chotard [STIH407_USB2_PORT1_POWERDOWN] = STIH407_PDN_1(5), 113584861ffSPatrice Chotard [STIH407_USB2_PORT0_POWERDOWN] = STIH407_PDN_1(4), 114584861ffSPatrice Chotard [STIH407_PCIE1_POWERDOWN] = STIH407_PDN_1(3), 115584861ffSPatrice Chotard [STIH407_PCIE0_POWERDOWN] = STIH407_PDN_1(2), 116584861ffSPatrice Chotard [STIH407_SATA1_POWERDOWN] = STIH407_PDN_1(1), 117584861ffSPatrice Chotard [STIH407_SATA0_POWERDOWN] = STIH407_PDN_1(0), 118584861ffSPatrice Chotard [STIH407_ETH1_POWERDOWN] = STIH407_PDN_ETH(0, 2), 119584861ffSPatrice Chotard }; 120584861ffSPatrice Chotard 121584861ffSPatrice Chotard /* Reset Generator control 0/1 */ 122584861ffSPatrice Chotard #define SYSCFG_5128 0x200 123584861ffSPatrice Chotard #define SYSCFG_5131 0x20c 124584861ffSPatrice Chotard #define SYSCFG_5132 0x210 125584861ffSPatrice Chotard 126584861ffSPatrice Chotard #define LPM_SYSCFG_1 0x4 /* Softreset IRB & SBC UART */ 127584861ffSPatrice Chotard 128aef5b738SPatrice Chotard static struct syscfg_reset_channel_data stih407_softresets[] = { 129584861ffSPatrice Chotard [STIH407_ETH1_SOFTRESET] = STIH407_SRST_SBC(SYSCFG_4002, 4), 130584861ffSPatrice Chotard [STIH407_MMC1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 3), 131584861ffSPatrice Chotard [STIH407_USB2_PORT0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 28), 132584861ffSPatrice Chotard [STIH407_USB2_PORT1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 29), 133584861ffSPatrice Chotard [STIH407_PICOPHY_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 30), 134584861ffSPatrice Chotard [STIH407_IRB_SOFTRESET] = STIH407_SRST_LPM(LPM_SYSCFG_1, 6), 135584861ffSPatrice Chotard [STIH407_PCIE0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 6), 136584861ffSPatrice Chotard [STIH407_PCIE1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 15), 137584861ffSPatrice Chotard [STIH407_SATA0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 7), 138584861ffSPatrice Chotard [STIH407_SATA1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 16), 139584861ffSPatrice Chotard [STIH407_MIPHY0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 4), 140584861ffSPatrice Chotard [STIH407_MIPHY1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 13), 141584861ffSPatrice Chotard [STIH407_MIPHY2_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 22), 142584861ffSPatrice Chotard [STIH407_SATA0_PWR_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 5), 143584861ffSPatrice Chotard [STIH407_SATA1_PWR_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 14), 144584861ffSPatrice Chotard [STIH407_DELTA_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 3), 145584861ffSPatrice Chotard [STIH407_BLITTER_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 10), 146584861ffSPatrice Chotard [STIH407_HDTVOUT_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 11), 147584861ffSPatrice Chotard [STIH407_HDQVDP_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 12), 148584861ffSPatrice Chotard [STIH407_VDP_AUX_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 14), 149584861ffSPatrice Chotard [STIH407_COMPO_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 15), 150584861ffSPatrice Chotard [STIH407_HDMI_TX_PHY_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 21), 151584861ffSPatrice Chotard [STIH407_JPEG_DEC_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 23), 152584861ffSPatrice Chotard [STIH407_VP8_DEC_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 24), 153584861ffSPatrice Chotard [STIH407_GPU_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 30), 154584861ffSPatrice Chotard [STIH407_HVA_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 0), 155584861ffSPatrice Chotard [STIH407_ERAM_HVA_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5132, 1), 156584861ffSPatrice Chotard [STIH407_LPM_SOFTRESET] = STIH407_SRST_SBC(SYSCFG_4002, 2), 157584861ffSPatrice Chotard [STIH407_KEYSCAN_SOFTRESET] = STIH407_SRST_LPM(LPM_SYSCFG_1, 8), 158584861ffSPatrice Chotard [STIH407_ST231_AUD_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 26), 159584861ffSPatrice Chotard [STIH407_ST231_DMU_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 27), 160584861ffSPatrice Chotard [STIH407_ST231_GP0_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5131, 28), 161584861ffSPatrice Chotard [STIH407_ST231_GP1_SOFTRESET] = STIH407_SRST_CORE(SYSCFG_5128, 2), 162584861ffSPatrice Chotard }; 163584861ffSPatrice Chotard 164584861ffSPatrice Chotard /* PicoPHY reset/control */ 165584861ffSPatrice Chotard #define SYSCFG_5061 0x0f4 166584861ffSPatrice Chotard 167aef5b738SPatrice Chotard static struct syscfg_reset_channel_data stih407_picophyresets[] = { 168584861ffSPatrice Chotard [STIH407_PICOPHY0_RESET] = STIH407_SRST_CORE(SYSCFG_5061, 5), 169584861ffSPatrice Chotard [STIH407_PICOPHY1_RESET] = STIH407_SRST_CORE(SYSCFG_5061, 6), 170584861ffSPatrice Chotard [STIH407_PICOPHY2_RESET] = STIH407_SRST_CORE(SYSCFG_5061, 7), 171584861ffSPatrice Chotard }; 172584861ffSPatrice Chotard 173584861ffSPatrice Chotard static const struct 174584861ffSPatrice Chotard syscfg_reset_controller_data stih407_powerdown_controller = { 175584861ffSPatrice Chotard .wait_for_ack = true, 176584861ffSPatrice Chotard .nr_channels = ARRAY_SIZE(stih407_powerdowns), 177584861ffSPatrice Chotard .channels = stih407_powerdowns, 178584861ffSPatrice Chotard }; 179584861ffSPatrice Chotard 180584861ffSPatrice Chotard static const struct 181584861ffSPatrice Chotard syscfg_reset_controller_data stih407_softreset_controller = { 182584861ffSPatrice Chotard .wait_for_ack = false, 183584861ffSPatrice Chotard .active_low = true, 184584861ffSPatrice Chotard .nr_channels = ARRAY_SIZE(stih407_softresets), 185584861ffSPatrice Chotard .channels = stih407_softresets, 186584861ffSPatrice Chotard }; 187584861ffSPatrice Chotard 188584861ffSPatrice Chotard static const struct 189584861ffSPatrice Chotard syscfg_reset_controller_data stih407_picophyreset_controller = { 190584861ffSPatrice Chotard .wait_for_ack = false, 191584861ffSPatrice Chotard .nr_channels = ARRAY_SIZE(stih407_picophyresets), 192584861ffSPatrice Chotard .channels = stih407_picophyresets, 193584861ffSPatrice Chotard }; 194584861ffSPatrice Chotard 195584861ffSPatrice Chotard phys_addr_t sti_reset_get_regmap(const char *compatible) 196584861ffSPatrice Chotard { 197584861ffSPatrice Chotard struct udevice *syscon; 198584861ffSPatrice Chotard struct regmap *regmap; 199584861ffSPatrice Chotard int node, ret; 200584861ffSPatrice Chotard 201584861ffSPatrice Chotard node = fdt_node_offset_by_compatible(gd->fdt_blob, -1, 202584861ffSPatrice Chotard compatible); 203584861ffSPatrice Chotard if (node < 0) { 204*90aa625cSMasahiro Yamada pr_err("unable to find %s node\n", compatible); 205584861ffSPatrice Chotard return node; 206584861ffSPatrice Chotard } 207584861ffSPatrice Chotard 208584861ffSPatrice Chotard ret = uclass_get_device_by_of_offset(UCLASS_SYSCON, node, &syscon); 209584861ffSPatrice Chotard if (ret) { 210*90aa625cSMasahiro Yamada pr_err("%s: uclass_get_device_by_of_offset failed: %d\n", 211584861ffSPatrice Chotard __func__, ret); 212584861ffSPatrice Chotard return ret; 213584861ffSPatrice Chotard } 214584861ffSPatrice Chotard 215584861ffSPatrice Chotard regmap = syscon_get_regmap(syscon); 216584861ffSPatrice Chotard if (!regmap) { 217*90aa625cSMasahiro Yamada pr_err("unable to get regmap for %s\n", syscon->name); 218584861ffSPatrice Chotard return -ENODEV; 219584861ffSPatrice Chotard } 220584861ffSPatrice Chotard 221584861ffSPatrice Chotard return regmap->base; 222584861ffSPatrice Chotard } 223584861ffSPatrice Chotard 224584861ffSPatrice Chotard static int sti_reset_program_hw(struct reset_ctl *reset_ctl, int assert) 225584861ffSPatrice Chotard { 226584861ffSPatrice Chotard struct udevice *dev = reset_ctl->dev; 227584861ffSPatrice Chotard struct syscfg_reset_controller_data *reset_desc = 228584861ffSPatrice Chotard (struct syscfg_reset_controller_data *)(dev->driver_data); 229aef5b738SPatrice Chotard struct syscfg_reset_channel_data *ch; 230584861ffSPatrice Chotard phys_addr_t base; 231584861ffSPatrice Chotard u32 ctrl_val = reset_desc->active_low ? !assert : !!assert; 232584861ffSPatrice Chotard void __iomem *reg; 233584861ffSPatrice Chotard 234584861ffSPatrice Chotard /* check if reset id is inside available range */ 235584861ffSPatrice Chotard if (reset_ctl->id >= reset_desc->nr_channels) 236584861ffSPatrice Chotard return -EINVAL; 237584861ffSPatrice Chotard 238584861ffSPatrice Chotard /* get reset sysconf register base address */ 239584861ffSPatrice Chotard base = sti_reset_get_regmap(reset_desc->channels[reset_ctl->id].compatible); 240584861ffSPatrice Chotard 241aef5b738SPatrice Chotard ch = &reset_desc->channels[reset_ctl->id]; 242aef5b738SPatrice Chotard 243aef5b738SPatrice Chotard /* check the deassert counter to assert reset when it reaches 0 */ 244aef5b738SPatrice Chotard if (!assert) { 245aef5b738SPatrice Chotard ch->deassert_cnt++; 246aef5b738SPatrice Chotard if (ch->deassert_cnt > 1) 247aef5b738SPatrice Chotard return 0; 248aef5b738SPatrice Chotard } else { 249aef5b738SPatrice Chotard if (ch->deassert_cnt > 0) { 250aef5b738SPatrice Chotard ch->deassert_cnt--; 251aef5b738SPatrice Chotard if (ch->deassert_cnt > 0) 252aef5b738SPatrice Chotard return 0; 253aef5b738SPatrice Chotard } else 254*90aa625cSMasahiro Yamada pr_err("Reset balancing error: reset_ctl=%p dev=%p id=%lu\n", 255aef5b738SPatrice Chotard reset_ctl, reset_ctl->dev, reset_ctl->id); 256aef5b738SPatrice Chotard } 257aef5b738SPatrice Chotard 258aef5b738SPatrice Chotard reg = (void __iomem *)base + ch->reset_offset; 259584861ffSPatrice Chotard 260584861ffSPatrice Chotard if (ctrl_val) 261aef5b738SPatrice Chotard generic_set_bit(ch->reset_bit, reg); 262584861ffSPatrice Chotard else 263aef5b738SPatrice Chotard generic_clear_bit(ch->reset_bit, reg); 264584861ffSPatrice Chotard 265584861ffSPatrice Chotard if (!reset_desc->wait_for_ack) 266584861ffSPatrice Chotard return 0; 267584861ffSPatrice Chotard 268aef5b738SPatrice Chotard reg = (void __iomem *)base + ch->ack_offset; 269aef5b738SPatrice Chotard if (wait_for_bit(__func__, reg, BIT(ch->ack_bit), ctrl_val, 270584861ffSPatrice Chotard 1000, false)) { 271*90aa625cSMasahiro Yamada pr_err("Stuck on waiting ack reset_ctl=%p dev=%p id=%lu\n", 272584861ffSPatrice Chotard reset_ctl, reset_ctl->dev, reset_ctl->id); 273584861ffSPatrice Chotard 274584861ffSPatrice Chotard return -ETIMEDOUT; 275584861ffSPatrice Chotard } 276584861ffSPatrice Chotard 277584861ffSPatrice Chotard return 0; 278584861ffSPatrice Chotard } 279584861ffSPatrice Chotard 280584861ffSPatrice Chotard static int sti_reset_request(struct reset_ctl *reset_ctl) 281584861ffSPatrice Chotard { 282584861ffSPatrice Chotard return 0; 283584861ffSPatrice Chotard } 284584861ffSPatrice Chotard 285584861ffSPatrice Chotard static int sti_reset_free(struct reset_ctl *reset_ctl) 286584861ffSPatrice Chotard { 287584861ffSPatrice Chotard return 0; 288584861ffSPatrice Chotard } 289584861ffSPatrice Chotard 290584861ffSPatrice Chotard static int sti_reset_assert(struct reset_ctl *reset_ctl) 291584861ffSPatrice Chotard { 292584861ffSPatrice Chotard return sti_reset_program_hw(reset_ctl, true); 293584861ffSPatrice Chotard } 294584861ffSPatrice Chotard 295584861ffSPatrice Chotard static int sti_reset_deassert(struct reset_ctl *reset_ctl) 296584861ffSPatrice Chotard { 297584861ffSPatrice Chotard return sti_reset_program_hw(reset_ctl, false); 298584861ffSPatrice Chotard } 299584861ffSPatrice Chotard 300584861ffSPatrice Chotard struct reset_ops sti_reset_ops = { 301584861ffSPatrice Chotard .request = sti_reset_request, 302584861ffSPatrice Chotard .free = sti_reset_free, 303584861ffSPatrice Chotard .rst_assert = sti_reset_assert, 304584861ffSPatrice Chotard .rst_deassert = sti_reset_deassert, 305584861ffSPatrice Chotard }; 306584861ffSPatrice Chotard 307584861ffSPatrice Chotard static int sti_reset_probe(struct udevice *dev) 308584861ffSPatrice Chotard { 309584861ffSPatrice Chotard struct sti_reset *priv = dev_get_priv(dev); 310584861ffSPatrice Chotard 311584861ffSPatrice Chotard priv->data = (void *)dev_get_driver_data(dev); 312584861ffSPatrice Chotard 313584861ffSPatrice Chotard return 0; 314584861ffSPatrice Chotard } 315584861ffSPatrice Chotard 316584861ffSPatrice Chotard static const struct udevice_id sti_reset_ids[] = { 317584861ffSPatrice Chotard { 318584861ffSPatrice Chotard .compatible = "st,stih407-picophyreset", 319584861ffSPatrice Chotard .data = (ulong)&stih407_picophyreset_controller, 320584861ffSPatrice Chotard }, 321584861ffSPatrice Chotard { 322584861ffSPatrice Chotard .compatible = "st,stih407-powerdown", 323584861ffSPatrice Chotard .data = (ulong)&stih407_powerdown_controller, 324584861ffSPatrice Chotard }, 325584861ffSPatrice Chotard { 326584861ffSPatrice Chotard .compatible = "st,stih407-softreset", 327584861ffSPatrice Chotard .data = (ulong)&stih407_softreset_controller, 328584861ffSPatrice Chotard }, 329584861ffSPatrice Chotard { } 330584861ffSPatrice Chotard }; 331584861ffSPatrice Chotard 332584861ffSPatrice Chotard U_BOOT_DRIVER(sti_reset) = { 333584861ffSPatrice Chotard .name = "sti_reset", 334584861ffSPatrice Chotard .id = UCLASS_RESET, 335584861ffSPatrice Chotard .of_match = sti_reset_ids, 336584861ffSPatrice Chotard .probe = sti_reset_probe, 337584861ffSPatrice Chotard .priv_auto_alloc_size = sizeof(struct sti_reset), 338584861ffSPatrice Chotard .ops = &sti_reset_ops, 339584861ffSPatrice Chotard }; 340