Lines Matching refs:aspi
63 struct aspeed_spi *aspi; member
82 u32 (*segment_start)(struct aspeed_spi *aspi, u32 reg);
83 u32 (*segment_end)(struct aspeed_spi *aspi, u32 reg);
84 u32 (*segment_reg)(struct aspeed_spi *aspi, u32 start, u32 end);
298 struct aspeed_spi *aspi = spi_controller_get_devdata(mem->spi->master); in do_aspeed_spi_exec_op() local
299 struct aspeed_spi_chip *chip = &aspi->chips[mem->spi->chip_select]; in do_aspeed_spi_exec_op()
304 dev_dbg(aspi->dev, in do_aspeed_spi_exec_op()
311 addr_mode = readl(aspi->regs + CE_CTRL_REG); in do_aspeed_spi_exec_op()
326 if (op->addr.nbytes == 4 && chip->aspi->data == &ast2400_spi_data) in do_aspeed_spi_exec_op()
342 writel(addr_mode, aspi->regs + CE_CTRL_REG); in do_aspeed_spi_exec_op()
360 writel(addr_mode_backup, aspi->regs + CE_CTRL_REG); in do_aspeed_spi_exec_op()
377 struct aspeed_spi *aspi = spi_controller_get_devdata(mem->spi->master); in aspeed_spi_get_name() local
378 struct device *dev = aspi->dev; in aspeed_spi_get_name()
389 static void aspeed_spi_get_windows(struct aspeed_spi *aspi, in aspeed_spi_get_windows() argument
392 const struct aspeed_spi_data *data = aspi->data; in aspeed_spi_get_windows()
396 for (cs = 0; cs < aspi->data->max_cs; cs++) { in aspeed_spi_get_windows()
397 reg_val = readl(aspi->regs + CE0_SEGMENT_ADDR_REG + cs * 4); in aspeed_spi_get_windows()
399 windows[cs].size = data->segment_end(aspi, reg_val) - in aspeed_spi_get_windows()
400 data->segment_start(aspi, reg_val); in aspeed_spi_get_windows()
401 windows[cs].offset = data->segment_start(aspi, reg_val) - aspi->ahb_base_phy; in aspeed_spi_get_windows()
402 dev_vdbg(aspi->dev, "CE%d offset=0x%.8x size=0x%x\n", cs, in aspeed_spi_get_windows()
413 struct aspeed_spi *aspi = chip->aspi; in aspeed_spi_chip_set_default_window() local
418 if (aspi->data == &ast2400_spi_data) { in aspeed_spi_chip_set_default_window()
420 win->size = aspi->ahb_window_size; in aspeed_spi_chip_set_default_window()
422 aspeed_spi_get_windows(aspi, windows); in aspeed_spi_chip_set_default_window()
425 chip->ahb_base = aspi->ahb_base + win->offset; in aspeed_spi_chip_set_default_window()
428 dev_dbg(aspi->dev, "CE%d default window [ 0x%.8x - 0x%.8x ] %dMB", in aspeed_spi_chip_set_default_window()
429 chip->cs, aspi->ahb_base_phy + win->offset, in aspeed_spi_chip_set_default_window()
430 aspi->ahb_base_phy + win->offset + win->size - 1, in aspeed_spi_chip_set_default_window()
436 static int aspeed_spi_set_window(struct aspeed_spi *aspi, in aspeed_spi_set_window() argument
439 u32 start = aspi->ahb_base_phy + win->offset; in aspeed_spi_set_window()
441 void __iomem *seg_reg = aspi->regs + CE0_SEGMENT_ADDR_REG + win->cs * 4; in aspeed_spi_set_window()
443 u32 seg_val = aspi->data->segment_reg(aspi, start, end); in aspeed_spi_set_window()
455 dev_err(aspi->dev, "CE%d invalid window [ 0x%.8x - 0x%.8x ] %dMB", in aspeed_spi_set_window()
462 dev_dbg(aspi->dev, "CE%d new window [ 0x%.8x - 0x%.8x ] %dMB", in aspeed_spi_set_window()
465 dev_dbg(aspi->dev, "CE%d window closed", win->cs); in aspeed_spi_set_window()
483 struct aspeed_spi *aspi = chip->aspi; in aspeed_spi_chip_adjust_window() local
489 if (aspi->data == &ast2400_spi_data) in aspeed_spi_chip_adjust_window()
496 if (aspi->data == &ast2500_spi_data && chip->cs == 0 && size == SZ_128M) { in aspeed_spi_chip_adjust_window()
498 dev_info(aspi->dev, "CE%d window resized to %dMB (AST2500 HW quirk)", in aspeed_spi_chip_adjust_window()
506 if ((aspi->data == &ast2600_spi_data || aspi->data == &ast2600_fmc_data) && in aspeed_spi_chip_adjust_window()
509 dev_info(aspi->dev, "CE%d window resized to %dMB (AST2600 Decoding)", in aspeed_spi_chip_adjust_window()
513 aspeed_spi_get_windows(aspi, windows); in aspeed_spi_chip_adjust_window()
519 if (win->offset + win->size > aspi->ahb_window_size) { in aspeed_spi_chip_adjust_window()
520 win->size = aspi->ahb_window_size - win->offset; in aspeed_spi_chip_adjust_window()
521 dev_warn(aspi->dev, "CE%d window resized to %dMB", chip->cs, win->size >> 20); in aspeed_spi_chip_adjust_window()
524 ret = aspeed_spi_set_window(aspi, win); in aspeed_spi_chip_adjust_window()
529 chip->ahb_base = aspi->ahb_base + win->offset; in aspeed_spi_chip_adjust_window()
536 if (chip->cs < aspi->data->max_cs - 1) { in aspeed_spi_chip_adjust_window()
546 aspeed_spi_set_window(aspi, next); in aspeed_spi_chip_adjust_window()
555 struct aspeed_spi *aspi = spi_controller_get_devdata(desc->mem->spi->master); in aspeed_spi_dirmap_create() local
556 struct aspeed_spi_chip *chip = &aspi->chips[desc->mem->spi->chip_select]; in aspeed_spi_dirmap_create()
561 dev_dbg(aspi->dev, in aspeed_spi_dirmap_create()
578 dev_warn(aspi->dev, "CE%d window (%dMB) too small for mapping", in aspeed_spi_dirmap_create()
592 u32 addr_mode = readl(aspi->regs + CE_CTRL_REG); in aspeed_spi_dirmap_create()
598 writel(addr_mode, aspi->regs + CE_CTRL_REG); in aspeed_spi_dirmap_create()
603 if (op->addr.nbytes == 4 && chip->aspi->data == &ast2400_spi_data) in aspeed_spi_dirmap_create()
613 dev_info(aspi->dev, "CE%d read buswidth:%d [0x%08x]\n", in aspeed_spi_dirmap_create()
622 struct aspeed_spi *aspi = spi_controller_get_devdata(desc->mem->spi->master); in aspeed_spi_dirmap_read() local
623 struct aspeed_spi_chip *chip = &aspi->chips[desc->mem->spi->chip_select]; in aspeed_spi_dirmap_read()
647 static void aspeed_spi_chip_set_type(struct aspeed_spi *aspi, unsigned int cs, int type) in aspeed_spi_chip_set_type() argument
651 reg = readl(aspi->regs + CONFIG_REG); in aspeed_spi_chip_set_type()
654 writel(reg, aspi->regs + CONFIG_REG); in aspeed_spi_chip_set_type()
657 static void aspeed_spi_chip_enable(struct aspeed_spi *aspi, unsigned int cs, bool enable) in aspeed_spi_chip_enable() argument
659 u32 we_bit = BIT(aspi->data->we0 + cs); in aspeed_spi_chip_enable()
660 u32 reg = readl(aspi->regs + CONFIG_REG); in aspeed_spi_chip_enable()
666 writel(reg, aspi->regs + CONFIG_REG); in aspeed_spi_chip_enable()
671 struct aspeed_spi *aspi = spi_controller_get_devdata(spi->master); in aspeed_spi_setup() local
672 const struct aspeed_spi_data *data = aspi->data; in aspeed_spi_setup()
674 struct aspeed_spi_chip *chip = &aspi->chips[cs]; in aspeed_spi_setup()
676 chip->aspi = aspi; in aspeed_spi_setup()
678 chip->ctl = aspi->regs + data->ctl0 + cs * 4; in aspeed_spi_setup()
682 aspeed_spi_chip_set_type(aspi, cs, CONFIG_TYPE_SPI); in aspeed_spi_setup()
685 dev_warn(aspi->dev, "CE%d window invalid", cs); in aspeed_spi_setup()
689 aspeed_spi_chip_enable(aspi, cs, true); in aspeed_spi_setup()
693 dev_dbg(aspi->dev, "CE%d setup done\n", cs); in aspeed_spi_setup()
699 struct aspeed_spi *aspi = spi_controller_get_devdata(spi->master); in aspeed_spi_cleanup() local
702 aspeed_spi_chip_enable(aspi, cs, false); in aspeed_spi_cleanup()
704 dev_dbg(aspi->dev, "CE%d cleanup done\n", cs); in aspeed_spi_cleanup()
707 static void aspeed_spi_enable(struct aspeed_spi *aspi, bool enable) in aspeed_spi_enable() argument
711 for (cs = 0; cs < aspi->data->max_cs; cs++) in aspeed_spi_enable()
712 aspeed_spi_chip_enable(aspi, cs, enable); in aspeed_spi_enable()
720 struct aspeed_spi *aspi; in aspeed_spi_probe() local
728 ctlr = devm_spi_alloc_master(dev, sizeof(*aspi)); in aspeed_spi_probe()
732 aspi = spi_controller_get_devdata(ctlr); in aspeed_spi_probe()
733 platform_set_drvdata(pdev, aspi); in aspeed_spi_probe()
734 aspi->data = data; in aspeed_spi_probe()
735 aspi->dev = dev; in aspeed_spi_probe()
738 aspi->regs = devm_ioremap_resource(dev, res); in aspeed_spi_probe()
739 if (IS_ERR(aspi->regs)) in aspeed_spi_probe()
740 return PTR_ERR(aspi->regs); in aspeed_spi_probe()
743 aspi->ahb_base = devm_ioremap_resource(dev, res); in aspeed_spi_probe()
744 if (IS_ERR(aspi->ahb_base)) { in aspeed_spi_probe()
746 return PTR_ERR(aspi->ahb_base); in aspeed_spi_probe()
749 aspi->ahb_window_size = resource_size(res); in aspeed_spi_probe()
750 aspi->ahb_base_phy = res->start; in aspeed_spi_probe()
752 aspi->clk = devm_clk_get(&pdev->dev, NULL); in aspeed_spi_probe()
753 if (IS_ERR(aspi->clk)) { in aspeed_spi_probe()
755 return PTR_ERR(aspi->clk); in aspeed_spi_probe()
758 aspi->clk_freq = clk_get_rate(aspi->clk); in aspeed_spi_probe()
759 if (!aspi->clk_freq) { in aspeed_spi_probe()
764 ret = clk_prepare_enable(aspi->clk); in aspeed_spi_probe()
788 clk_disable_unprepare(aspi->clk); in aspeed_spi_probe()
794 struct aspeed_spi *aspi = platform_get_drvdata(pdev); in aspeed_spi_remove() local
796 aspeed_spi_enable(aspi, false); in aspeed_spi_remove()
797 clk_disable_unprepare(aspi->clk); in aspeed_spi_remove()
810 static u32 aspeed_spi_segment_start(struct aspeed_spi *aspi, u32 reg) in aspeed_spi_segment_start() argument
815 static u32 aspeed_spi_segment_end(struct aspeed_spi *aspi, u32 reg) in aspeed_spi_segment_end() argument
820 static u32 aspeed_spi_segment_reg(struct aspeed_spi *aspi, u32 start, u32 end) in aspeed_spi_segment_reg() argument
832 static u32 aspeed_spi_segment_ast2600_start(struct aspeed_spi *aspi, in aspeed_spi_segment_ast2600_start() argument
837 return aspi->ahb_base_phy + start_offset; in aspeed_spi_segment_ast2600_start()
840 static u32 aspeed_spi_segment_ast2600_end(struct aspeed_spi *aspi, in aspeed_spi_segment_ast2600_end() argument
847 return aspi->ahb_base_phy; in aspeed_spi_segment_ast2600_end()
849 return aspi->ahb_base_phy + end_offset + 0x100000; in aspeed_spi_segment_ast2600_end()
852 static u32 aspeed_spi_segment_ast2600_reg(struct aspeed_spi *aspi, in aspeed_spi_segment_ast2600_reg() argument
895 struct aspeed_spi *aspi = chip->aspi; in aspeed_spi_calibrate() local
896 const struct aspeed_spi_data *data = aspi->data; in aspeed_spi_calibrate()
912 writel(fread_timing_val, aspi->regs + data->timing); in aspeed_spi_calibrate()
915 dev_dbg(aspi->dev, in aspeed_spi_calibrate()
938 writel(fread_timing_val, aspi->regs + data->timing); in aspeed_spi_calibrate()
940 dev_dbg(aspi->dev, " * -> good is pass %d [0x%08x]", in aspeed_spi_calibrate()
976 struct aspeed_spi *aspi = chip->aspi; in aspeed_spi_do_calibration() local
977 const struct aspeed_spi_data *data = aspi->data; in aspeed_spi_do_calibration()
978 u32 ahb_freq = aspi->clk_freq; in aspeed_spi_do_calibration()
985 dev_dbg(aspi->dev, "calculate timing compensation - AHB freq: %d MHz", in aspeed_spi_do_calibration()
1003 dev_info(aspi->dev, "Calibration area too uniform, using low speed"); in aspeed_spi_do_calibration()
1023 dev_dbg(aspi->dev, "Trying HCLK/%d [%08x] ...", i, tv); in aspeed_spi_do_calibration()
1031 dev_warn(aspi->dev, "No good frequency, using dumb slow"); in aspeed_spi_do_calibration()
1033 dev_dbg(aspi->dev, "Found good read timings at HCLK/%d", best_div); in aspeed_spi_do_calibration()
1050 ((chip)->aspi->regs + (chip)->aspi->data->timing + \
1056 struct aspeed_spi *aspi = chip->aspi; in aspeed_spi_ast2600_calibrate() local
1072 dev_dbg(aspi->dev, in aspeed_spi_ast2600_calibrate()
1088 dev_dbg(aspi->dev, in aspeed_spi_ast2600_calibrate()