static int fsi_set_rate(struct device *dev, int is_porta, int rate, int enable) { struct clk *fsib_clk; struct clk *fdiv_clk = &sh7372_fsidivb_clk; long fsib_rate = 0; long fdiv_rate = 0; int ackmd_bpfmd; int ret; /* FSIA is slave mode. nothing to do here */ if (is_porta) return 0; /* clock start */ switch (rate) { case 44100: fsib_rate = rate * 256; ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; break; case 48000: fsib_rate = 85428000; /* around 48kHz x 256 x 7 */ fdiv_rate = rate * 256; ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; break; default: pr_err("unsupported rate in FSI2 port B\n"); return -EINVAL; } /* FSI B setting */ fsib_clk = clk_get(dev, "ickb"); if (IS_ERR(fsib_clk)) return -EIO; /* fsib */ ret = __fsi_set_round_rate(fsib_clk, fsib_rate, enable); if (ret < 0) goto fsi_set_rate_end; /* FSI DIV */ ret = __fsi_set_round_rate(fdiv_clk, fdiv_rate, enable); if (ret < 0) { /* disable FSI B */ if (enable) __fsi_set_round_rate(fsib_clk, fsib_rate, 0); goto fsi_set_rate_end; } ret = ackmd_bpfmd; fsi_set_rate_end: clk_put(fsib_clk); return ret; }
static int fsi_b_set_rate(struct device *dev, int rate, int enable) { struct clk *fsib_clk; struct clk *fdiv_clk = &sh7372_fsidivb_clk; long fsib_rate = 0; long fdiv_rate = 0; int ackmd_bpfmd; int ret; switch (rate) { case 44100: fsib_rate = rate * 256; ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; break; case 48000: fsib_rate = 85428000; fdiv_rate = rate * 256; ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; break; default: pr_err("unsupported rate in FSI2 port B\n"); return -EINVAL; } fsib_clk = clk_get(dev, "ickb"); if (IS_ERR(fsib_clk)) return -EIO; ret = __fsi_set_round_rate(fsib_clk, fsib_rate, enable); if (ret < 0) goto fsi_set_rate_end; ret = __fsi_set_round_rate(fdiv_clk, fdiv_rate, enable); if (ret < 0) { if (enable) __fsi_set_round_rate(fsib_clk, fsib_rate, 0); goto fsi_set_rate_end; } ret = ackmd_bpfmd; fsi_set_rate_end: clk_put(fsib_clk); return ret; }
static int fsi_hdmi_set_rate(struct device *dev, int rate, int enable) { struct clk *fsib_clk; struct clk *fdiv_clk = &sh7372_fsidivb_clk; long fsib_rate = 0; long fdiv_rate = 0; int ackmd_bpfmd; int ret; switch (rate) { case 44100: fsib_rate = rate * 256; ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; break; case 48000: fsib_rate = 85428000; /* around 48kHz x 256 x 7 */ fdiv_rate = rate * 256; ackmd_bpfmd = SH_FSI_ACKMD_256 | SH_FSI_BPFMD_64; break; default: pr_err("unsupported rate in FSI2 port B\n"); return -EINVAL; } /* FSI B setting */ fsib_clk = clk_get(dev, "ickb"); if (IS_ERR(fsib_clk)) return -EIO; ret = __fsi_set_round_rate(fsib_clk, fsib_rate, enable); clk_put(fsib_clk); if (ret < 0) return ret; /* FSI DIV setting */ ret = __fsi_set_round_rate(fdiv_clk, fdiv_rate, enable); if (ret < 0) { /* disable FSI B */ if (enable) __fsi_set_round_rate(fsib_clk, fsib_rate, 0); return ret; } return ackmd_bpfmd; }
static int fsi_ak4642_set_rate(struct device *dev, int rate, int enable) { struct clk *fsia_ick; struct clk *fsiack; int ret = -EIO; fsia_ick = clk_get(dev, "icka"); if (IS_ERR(fsia_ick)) return PTR_ERR(fsia_ick); /* * FSIACK is connected to AK4642, * and use external clock pin from it. * it is parent of fsia_ick now. */ fsiack = clk_get_parent(fsia_ick); if (!fsiack) goto fsia_ick_out; /* * we get 1/1 divided clock by setting same rate to fsiack and fsia_ick * ** FIXME ** * Because the freq_table of external clk (fsiack) are all 0, * the return value of clk_round_rate became 0. * So, it use __fsi_set_rate here. */ ret = __fsi_set_rate(fsiack, rate, enable); if (ret < 0) goto fsiack_out; ret = __fsi_set_round_rate(fsia_ick, rate, enable); if ((ret < 0) && enable) __fsi_set_round_rate(fsiack, rate, 0); /* disable FSI ACK */ fsiack_out: clk_put(fsiack); fsia_ick_out: clk_put(fsia_ick); return 0; }