Lines Matching +full:rz +full:- +full:mtu3
1 // SPDX-License-Identifier: GPL-2.0
3 * Renesas RZ/G2L Multi-Function Timer Pulse Unit 3(MTU3a) Core driver
13 #include <linux/mfd/rz-mtu3.h>
20 #include "rz-mtu3.h"
28 /******* MTU3 registers (original offset is +0x1200) *******/
67 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_shared_reg_read()
68 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_shared_reg_read()
71 return readw(priv->mmio + offset); in rz_mtu3_shared_reg_read()
73 return readb(priv->mmio + offset); in rz_mtu3_shared_reg_read()
79 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_8bit_ch_read()
80 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_8bit_ch_read()
83 ch_offs = rz_mtu3_8bit_ch_reg_offs[ch->channel_number][offset]; in rz_mtu3_8bit_ch_read()
85 return readb(priv->mmio + ch_offs); in rz_mtu3_8bit_ch_read()
91 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_16bit_ch_read()
92 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_16bit_ch_read()
95 /* MTU8 doesn't have 16-bit registers */ in rz_mtu3_16bit_ch_read()
96 if (ch->channel_number == RZ_MTU3_CHAN_8) in rz_mtu3_16bit_ch_read()
99 ch_offs = rz_mtu3_16bit_ch_reg_offs[ch->channel_number][offset]; in rz_mtu3_16bit_ch_read()
101 return readw(priv->mmio + ch_offs); in rz_mtu3_16bit_ch_read()
107 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_32bit_ch_read()
108 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_32bit_ch_read()
111 if (ch->channel_number != RZ_MTU3_CHAN_1 && ch->channel_number != RZ_MTU3_CHAN_8) in rz_mtu3_32bit_ch_read()
114 ch_offs = rz_mtu3_32bit_ch_reg_offs[ch->channel_number][offset]; in rz_mtu3_32bit_ch_read()
116 return readl(priv->mmio + ch_offs); in rz_mtu3_32bit_ch_read()
122 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_8bit_ch_write()
123 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_8bit_ch_write()
126 ch_offs = rz_mtu3_8bit_ch_reg_offs[ch->channel_number][offset]; in rz_mtu3_8bit_ch_write()
127 writeb(val, priv->mmio + ch_offs); in rz_mtu3_8bit_ch_write()
133 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_16bit_ch_write()
134 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_16bit_ch_write()
137 /* MTU8 doesn't have 16-bit registers */ in rz_mtu3_16bit_ch_write()
138 if (ch->channel_number == RZ_MTU3_CHAN_8) in rz_mtu3_16bit_ch_write()
141 ch_offs = rz_mtu3_16bit_ch_reg_offs[ch->channel_number][offset]; in rz_mtu3_16bit_ch_write()
142 writew(val, priv->mmio + ch_offs); in rz_mtu3_16bit_ch_write()
148 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_32bit_ch_write()
149 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_32bit_ch_write()
152 if (ch->channel_number != RZ_MTU3_CHAN_1 && ch->channel_number != RZ_MTU3_CHAN_8) in rz_mtu3_32bit_ch_write()
155 ch_offs = rz_mtu3_32bit_ch_reg_offs[ch->channel_number][offset]; in rz_mtu3_32bit_ch_write()
156 writel(val, priv->mmio + ch_offs); in rz_mtu3_32bit_ch_write()
162 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_shared_reg_write()
163 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_shared_reg_write()
166 writew(value, priv->mmio + offset); in rz_mtu3_shared_reg_write()
168 writeb((u8)value, priv->mmio + offset); in rz_mtu3_shared_reg_write()
175 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_shared_reg_update_bit()
176 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_shared_reg_update_bit()
179 spin_lock_irqsave(&priv->lock, flags); in rz_mtu3_shared_reg_update_bit()
183 spin_unlock_irqrestore(&priv->lock, flags); in rz_mtu3_shared_reg_update_bit()
191 switch (ch->channel_number) { in rz_mtu3_get_tstr_offset()
219 switch (ch->channel_number) { in rz_mtu3_get_tstr_bit_pos()
225 bitpos = ch->channel_number; in rz_mtu3_get_tstr_bit_pos()
249 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_start_stop_ch()
250 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_start_stop_ch()
259 spin_lock_irqsave(&priv->lock, flags); in rz_mtu3_start_stop_ch()
265 spin_unlock_irqrestore(&priv->lock, flags); in rz_mtu3_start_stop_ch()
270 struct rz_mtu3 *mtu = dev_get_drvdata(ch->dev->parent); in rz_mtu3_is_enabled()
271 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_is_enabled()
280 spin_lock_irqsave(&priv->lock, flags); in rz_mtu3_is_enabled()
282 spin_unlock_irqrestore(&priv->lock, flags); in rz_mtu3_is_enabled()
307 struct rz_mtu3_priv *priv = mtu->priv_data; in rz_mtu3_reset_assert()
310 reset_control_assert(priv->rstc); in rz_mtu3_reset_assert()
315 .name = "rz-mtu3-counter",
318 .name = "pwm-rz-mtu3",
329 ddata = devm_kzalloc(&pdev->dev, sizeof(*ddata), GFP_KERNEL); in rz_mtu3_probe()
331 return -ENOMEM; in rz_mtu3_probe()
333 ddata->priv_data = devm_kzalloc(&pdev->dev, sizeof(*priv), GFP_KERNEL); in rz_mtu3_probe()
334 if (!ddata->priv_data) in rz_mtu3_probe()
335 return -ENOMEM; in rz_mtu3_probe()
337 priv = ddata->priv_data; in rz_mtu3_probe()
339 priv->mmio = devm_platform_ioremap_resource(pdev, 0); in rz_mtu3_probe()
340 if (IS_ERR(priv->mmio)) in rz_mtu3_probe()
341 return PTR_ERR(priv->mmio); in rz_mtu3_probe()
343 priv->rstc = devm_reset_control_get_exclusive(&pdev->dev, NULL); in rz_mtu3_probe()
344 if (IS_ERR(priv->rstc)) in rz_mtu3_probe()
345 return PTR_ERR(priv->rstc); in rz_mtu3_probe()
347 ddata->clk = devm_clk_get(&pdev->dev, NULL); in rz_mtu3_probe()
348 if (IS_ERR(ddata->clk)) in rz_mtu3_probe()
349 return PTR_ERR(ddata->clk); in rz_mtu3_probe()
351 reset_control_deassert(priv->rstc); in rz_mtu3_probe()
352 spin_lock_init(&priv->lock); in rz_mtu3_probe()
356 ddata->channels[i].channel_number = i; in rz_mtu3_probe()
357 ddata->channels[i].is_busy = false; in rz_mtu3_probe()
358 mutex_init(&ddata->channels[i].lock); in rz_mtu3_probe()
361 ret = mfd_add_devices(&pdev->dev, 0, rz_mtu3_devs, in rz_mtu3_probe()
366 return devm_add_action_or_reset(&pdev->dev, rz_mtu3_reset_assert, in rz_mtu3_probe()
367 &pdev->dev); in rz_mtu3_probe()
370 reset_control_assert(priv->rstc); in rz_mtu3_probe()
375 { .compatible = "renesas,rz-mtu3", },
383 .name = "rz-mtu3",
390 MODULE_DESCRIPTION("Renesas RZ/G2L MTU3a Core Driver");