Lines Matching refs:data
102 static int si570_get_divs(struct clk_si570 *data, u64 *rfreq, in si570_get_divs() argument
109 err = regmap_bulk_read(data->regmap, SI570_REG_HS_N1 + data->div_offset, in si570_get_divs()
136 static int si570_get_defaults(struct clk_si570 *data, u64 fout) in si570_get_defaults() argument
141 regmap_write(data->regmap, SI570_REG_CONTROL, SI570_CNTRL_RECALL); in si570_get_defaults()
143 err = si570_get_divs(data, &data->rfreq, &data->n1, &data->hs_div); in si570_get_defaults()
151 fdco = fout * data->n1 * data->hs_div; in si570_get_defaults()
153 data->fxtal = div64_u64(fdco << 24, data->rfreq >> 4); in si570_get_defaults()
155 data->fxtal = div64_u64(fdco << 28, data->rfreq); in si570_get_defaults()
157 data->frequency = fout; in si570_get_defaults()
167 static int si570_update_rfreq(struct clk_si570 *data) in si570_update_rfreq() argument
171 reg[0] = ((data->n1 - 1) << 6) | in si570_update_rfreq()
172 ((data->rfreq >> 32) & RFREQ_37_32_MASK); in si570_update_rfreq()
173 reg[1] = (data->rfreq >> 24) & 0xff; in si570_update_rfreq()
174 reg[2] = (data->rfreq >> 16) & 0xff; in si570_update_rfreq()
175 reg[3] = (data->rfreq >> 8) & 0xff; in si570_update_rfreq()
176 reg[4] = data->rfreq & 0xff; in si570_update_rfreq()
178 return regmap_bulk_write(data->regmap, SI570_REG_N1_RFREQ0 + in si570_update_rfreq()
179 data->div_offset, reg, ARRAY_SIZE(reg)); in si570_update_rfreq()
194 static int si570_calc_divs(unsigned long frequency, struct clk_si570 *data, in si570_calc_divs() argument
215 *out_rfreq = div64_u64(fdco << 28, data->fxtal); in si570_calc_divs()
234 struct clk_si570 *data = to_clk_si570(hw); in si570_recalc_rate() local
236 err = si570_get_divs(data, &rfreq, &n1, &hs_div); in si570_recalc_rate()
238 dev_err(&data->i2c_client->dev, "unable to recalc rate\n"); in si570_recalc_rate()
239 return data->frequency; in si570_recalc_rate()
243 rate = (data->fxtal * rfreq) >> 28; in si570_recalc_rate()
254 struct clk_si570 *data = to_clk_si570(hw); in si570_round_rate() local
259 if (div64_u64(abs(rate - data->frequency) * 10000LL, in si570_round_rate()
260 data->frequency) < 35) { in si570_round_rate()
261 rfreq = div64_u64((data->rfreq * rate) + in si570_round_rate()
262 div64_u64(data->frequency, 2), data->frequency); in si570_round_rate()
263 n1 = data->n1; in si570_round_rate()
264 hs_div = data->hs_div; in si570_round_rate()
267 err = si570_calc_divs(rate, data, &rfreq, &n1, &hs_div); in si570_round_rate()
269 dev_err(&data->i2c_client->dev, in si570_round_rate()
286 static int si570_set_frequency(struct clk_si570 *data, unsigned long frequency) in si570_set_frequency() argument
290 err = si570_calc_divs(frequency, data, &data->rfreq, &data->n1, in si570_set_frequency()
291 &data->hs_div); in si570_set_frequency()
299 regmap_write(data->regmap, SI570_REG_FREEZE_DCO, SI570_FREEZE_DCO); in si570_set_frequency()
300 regmap_write(data->regmap, SI570_REG_HS_N1 + data->div_offset, in si570_set_frequency()
301 ((data->hs_div - HS_DIV_OFFSET) << HS_DIV_SHIFT) | in si570_set_frequency()
302 (((data->n1 - 1) >> 2) & N1_6_2_MASK)); in si570_set_frequency()
303 si570_update_rfreq(data); in si570_set_frequency()
304 regmap_write(data->regmap, SI570_REG_FREEZE_DCO, 0); in si570_set_frequency()
305 regmap_write(data->regmap, SI570_REG_CONTROL, SI570_CNTRL_NEWFREQ); in si570_set_frequency()
321 static int si570_set_frequency_small(struct clk_si570 *data, in si570_set_frequency_small() argument
329 data->rfreq = div64_u64((data->rfreq * frequency) + in si570_set_frequency_small()
330 div_u64(data->frequency, 2), data->frequency); in si570_set_frequency_small()
331 regmap_write(data->regmap, SI570_REG_CONTROL, SI570_CNTRL_FREEZE_M); in si570_set_frequency_small()
332 si570_update_rfreq(data); in si570_set_frequency_small()
333 regmap_write(data->regmap, SI570_REG_CONTROL, 0); in si570_set_frequency_small()
344 struct clk_si570 *data = to_clk_si570(hw); in si570_set_rate() local
345 struct i2c_client *client = data->i2c_client; in si570_set_rate()
348 if (rate < SI570_MIN_FREQ || rate > data->max_freq) { in si570_set_rate()
354 if (div64_u64(abs(rate - data->frequency) * 10000LL, in si570_set_rate()
355 data->frequency) < 35) in si570_set_rate()
356 err = si570_set_frequency_small(data, rate); in si570_set_rate()
358 err = si570_set_frequency(data, rate); in si570_set_rate()
363 data->frequency = rate; in si570_set_rate()
408 struct clk_si570 *data; in si570_probe() local
415 data = devm_kzalloc(&client->dev, sizeof(*data), GFP_KERNEL); in si570_probe()
416 if (!data) in si570_probe()
422 data->hw.init = &init; in si570_probe()
423 data->i2c_client = client; in si570_probe()
435 data->div_offset = SI570_DIV_OFFSET_7PPM; in si570_probe()
437 data->max_freq = SI570_MAX_FREQ; in si570_probe()
439 data->max_freq = SI598_MAX_FREQ; in si570_probe()
453 data->regmap = devm_regmap_init_i2c(client, &si570_regmap_config); in si570_probe()
454 if (IS_ERR(data->regmap)) { in si570_probe()
456 return PTR_ERR(data->regmap); in si570_probe()
459 i2c_set_clientdata(client, data); in si570_probe()
460 err = si570_get_defaults(data, factory_fout); in si570_probe()
464 clk = devm_clk_register(&client->dev, &data->hw); in si570_probe()
488 data->frequency); in si570_probe()