Lines Matching +full:cs +full:- +full:0
1 // SPDX-License-Identifier: GPL-2.0-only
8 * Author: Boris Brezillon <boris.brezillon@free-electrons.com>
11 #include <linux/mfd/syscon/atmel-smc.h>
15 * atmel_smc_cs_conf_init - initialize a SMC CS conf
16 * @conf: the SMC CS conf to initialize
18 * Set all fields to 0 so that one can start defining a new config.
22 memset(conf, 0, sizeof(*conf)); in atmel_smc_cs_conf_init()
27 * atmel_smc_cs_encode_ncycles - encode a number of MCK clk cycles in the
40 * If the @ncycles value is too big to be encoded, -ERANGE is returned and
41 * the encodedval is contains the maximum val. Otherwise, 0 is returned.
49 unsigned int lsbmask = GENMASK(msbpos - 1, 0); in atmel_smc_cs_encode_ncycles()
50 unsigned int msbmask = GENMASK(msbwidth - 1, 0); in atmel_smc_cs_encode_ncycles()
52 int ret = 0; in atmel_smc_cs_encode_ncycles()
58 lsb = 0; in atmel_smc_cs_encode_ncycles()
65 * We still return -ERANGE in case the caller cares. in atmel_smc_cs_encode_ncycles()
70 ret = -ERANGE; in atmel_smc_cs_encode_ncycles()
79 * atmel_smc_cs_conf_set_timing - set the SMC CS conf Txx parameter to a
81 * @conf: SMC CS conf descriptor
88 * @conf->timings field at @shift position.
90 * Returns -EINVAL if shift is invalid, -ERANGE if ncycles does not fit in
91 * the field, and 0 otherwise.
104 return -EINVAL; in atmel_smc_cs_conf_set_timing()
110 * ncycles = (Txx[3] * 64) + Txx[2:0] in atmel_smc_cs_conf_set_timing()
113 conf->timings &= ~GENMASK(shift + 3, shift); in atmel_smc_cs_conf_set_timing()
114 conf->timings |= val << shift; in atmel_smc_cs_conf_set_timing()
121 * atmel_smc_cs_conf_set_setup - set the SMC CS conf xx_SETUP parameter to a
123 * @conf: SMC CS conf descriptor
130 * @conf->setup field at @shift position.
132 * Returns -EINVAL if @shift is invalid, -ERANGE if @ncycles does not fit in
133 * the field, and 0 otherwise.
143 return -EINVAL; in atmel_smc_cs_conf_set_setup()
149 * ncycles = (128 * xx_SETUP[5]) + xx_SETUP[4:0] in atmel_smc_cs_conf_set_setup()
152 conf->setup &= ~GENMASK(shift + 7, shift); in atmel_smc_cs_conf_set_setup()
153 conf->setup |= val << shift; in atmel_smc_cs_conf_set_setup()
160 * atmel_smc_cs_conf_set_pulse - set the SMC CS conf xx_PULSE parameter to a
162 * @conf: SMC CS conf descriptor
169 * @conf->setup field at @shift position.
171 * Returns -EINVAL if @shift is invalid, -ERANGE if @ncycles does not fit in
172 * the field, and 0 otherwise.
182 return -EINVAL; in atmel_smc_cs_conf_set_pulse()
188 * ncycles = (256 * xx_PULSE[6]) + xx_PULSE[5:0] in atmel_smc_cs_conf_set_pulse()
191 conf->pulse &= ~GENMASK(shift + 7, shift); in atmel_smc_cs_conf_set_pulse()
192 conf->pulse |= val << shift; in atmel_smc_cs_conf_set_pulse()
199 * atmel_smc_cs_conf_set_cycle - set the SMC CS conf xx_CYCLE parameter to a
201 * @conf: SMC CS conf descriptor
208 * @conf->setup field at @shift position.
210 * Returns -EINVAL if @shift is invalid, -ERANGE if @ncycles does not fit in
211 * the field, and 0 otherwise.
220 return -EINVAL; in atmel_smc_cs_conf_set_cycle()
226 * ncycles = (xx_CYCLE[8:7] * 256) + xx_CYCLE[6:0] in atmel_smc_cs_conf_set_cycle()
229 conf->cycle &= ~GENMASK(shift + 15, shift); in atmel_smc_cs_conf_set_cycle()
230 conf->cycle |= val << shift; in atmel_smc_cs_conf_set_cycle()
237 * atmel_smc_cs_conf_apply - apply an SMC CS conf
239 * @cs: the CS id
240 * @conf: the SMC CS conf to apply
242 * Applies an SMC CS configuration.
245 void atmel_smc_cs_conf_apply(struct regmap *regmap, int cs, in atmel_smc_cs_conf_apply() argument
248 regmap_write(regmap, ATMEL_SMC_SETUP(cs), conf->setup); in atmel_smc_cs_conf_apply()
249 regmap_write(regmap, ATMEL_SMC_PULSE(cs), conf->pulse); in atmel_smc_cs_conf_apply()
250 regmap_write(regmap, ATMEL_SMC_CYCLE(cs), conf->cycle); in atmel_smc_cs_conf_apply()
251 regmap_write(regmap, ATMEL_SMC_MODE(cs), conf->mode); in atmel_smc_cs_conf_apply()
256 * atmel_hsmc_cs_conf_apply - apply an SMC CS conf
258 * @cs: the CS id
260 * @conf: the SMC CS conf to apply
262 * Applies an SMC CS configuration.
263 * Only valid on post-sama5 SoCs.
267 int cs, const struct atmel_smc_cs_conf *conf) in atmel_hsmc_cs_conf_apply() argument
269 regmap_write(regmap, ATMEL_HSMC_SETUP(layout, cs), conf->setup); in atmel_hsmc_cs_conf_apply()
270 regmap_write(regmap, ATMEL_HSMC_PULSE(layout, cs), conf->pulse); in atmel_hsmc_cs_conf_apply()
271 regmap_write(regmap, ATMEL_HSMC_CYCLE(layout, cs), conf->cycle); in atmel_hsmc_cs_conf_apply()
272 regmap_write(regmap, ATMEL_HSMC_TIMINGS(layout, cs), conf->timings); in atmel_hsmc_cs_conf_apply()
273 regmap_write(regmap, ATMEL_HSMC_MODE(layout, cs), conf->mode); in atmel_hsmc_cs_conf_apply()
278 * atmel_smc_cs_conf_get - retrieve the current SMC CS conf
280 * @cs: the CS id
281 * @conf: the SMC CS conf object to store the current conf
283 * Retrieve the SMC CS configuration.
286 void atmel_smc_cs_conf_get(struct regmap *regmap, int cs, in atmel_smc_cs_conf_get() argument
289 regmap_read(regmap, ATMEL_SMC_SETUP(cs), &conf->setup); in atmel_smc_cs_conf_get()
290 regmap_read(regmap, ATMEL_SMC_PULSE(cs), &conf->pulse); in atmel_smc_cs_conf_get()
291 regmap_read(regmap, ATMEL_SMC_CYCLE(cs), &conf->cycle); in atmel_smc_cs_conf_get()
292 regmap_read(regmap, ATMEL_SMC_MODE(cs), &conf->mode); in atmel_smc_cs_conf_get()
297 * atmel_hsmc_cs_conf_get - retrieve the current SMC CS conf
299 * @cs: the CS id
301 * @conf: the SMC CS conf object to store the current conf
303 * Retrieve the SMC CS configuration.
304 * Only valid on post-sama5 SoCs.
308 int cs, struct atmel_smc_cs_conf *conf) in atmel_hsmc_cs_conf_get() argument
310 regmap_read(regmap, ATMEL_HSMC_SETUP(layout, cs), &conf->setup); in atmel_hsmc_cs_conf_get()
311 regmap_read(regmap, ATMEL_HSMC_PULSE(layout, cs), &conf->pulse); in atmel_hsmc_cs_conf_get()
312 regmap_read(regmap, ATMEL_HSMC_CYCLE(layout, cs), &conf->cycle); in atmel_hsmc_cs_conf_get()
313 regmap_read(regmap, ATMEL_HSMC_TIMINGS(layout, cs), &conf->timings); in atmel_hsmc_cs_conf_get()
314 regmap_read(regmap, ATMEL_HSMC_MODE(layout, cs), &conf->mode); in atmel_hsmc_cs_conf_get()
319 .timing_regs_offset = 0x600,
323 .timing_regs_offset = 0x700,
327 { .compatible = "atmel,at91sam9260-smc", .data = NULL },
328 { .compatible = "atmel,sama5d3-smc", .data = &sama5d3_reg_layout },
329 { .compatible = "atmel,sama5d2-smc", .data = &sama5d2_reg_layout },
334 * atmel_hsmc_get_reg_layout - retrieve the layout of HSMC registers
340 * in HSMC case, otherwise ERR_PTR(-EINVAL).
349 return match ? match->data : ERR_PTR(-EINVAL); in atmel_hsmc_get_reg_layout()