Lines Matching refs:host
578 static void brcmnand_wr_corr_thresh(struct brcmnand_host *host, u8 val) in brcmnand_wr_corr_thresh() argument
580 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_wr_corr_thresh()
583 int cs = host->cs; in brcmnand_wr_corr_thresh()
648 static void brcmnand_set_ecc_enabled(struct brcmnand_host *host, int en) in brcmnand_set_ecc_enabled() argument
650 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_set_ecc_enabled()
651 u16 offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_ACC_CONTROL); in brcmnand_set_ecc_enabled()
657 acc_control |= host->hwcfg.ecc_level in brcmnand_set_ecc_enabled()
677 static int brcmnand_get_sector_size_1k(struct brcmnand_host *host) in brcmnand_get_sector_size_1k() argument
679 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_get_sector_size_1k()
681 u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs, in brcmnand_get_sector_size_1k()
690 static void brcmnand_set_sector_size_1k(struct brcmnand_host *host, int val) in brcmnand_set_sector_size_1k() argument
692 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_set_sector_size_1k()
694 u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs, in brcmnand_set_sector_size_1k()
786 struct brcmnand_host *host) in brcmnand_create_layout() argument
788 struct brcmnand_cfg *cfg = &host->hwcfg; in brcmnand_create_layout()
796 layout = devm_kzalloc(&host->pdev->dev, sizeof(*layout), GFP_KERNEL); in brcmnand_create_layout()
840 dev_err(&host->pdev->dev, in brcmnand_create_layout()
888 struct brcmnand_host *host) in brcmstb_choose_ecc_layout() argument
891 struct brcmnand_cfg *p = &host->hwcfg; in brcmstb_choose_ecc_layout()
897 layout = brcmnand_create_layout(ecc_level, host); in brcmstb_choose_ecc_layout()
899 dev_err(&host->pdev->dev, in brcmstb_choose_ecc_layout()
910 struct brcmnand_host *host = chip->priv; in brcmnand_wp() local
911 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_wp()
1045 static void brcmnand_send_cmd(struct brcmnand_host *host, int cmd) in brcmnand_send_cmd() argument
1047 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_send_cmd()
1076 struct brcmnand_host *host = chip->priv; in brcmnand_waitfunc() local
1077 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_waitfunc()
1106 static int brcmnand_low_level_op(struct brcmnand_host *host, in brcmnand_low_level_op() argument
1110 struct mtd_info *mtd = &host->mtd; in brcmnand_low_level_op()
1111 struct nand_chip *chip = &host->chip; in brcmnand_low_level_op()
1112 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_low_level_op()
1142 brcmnand_send_cmd(host, CMD_LOW_LEVEL_OP); in brcmnand_low_level_op()
1150 struct brcmnand_host *host = chip->priv; in brcmnand_cmdfunc() local
1151 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_cmdfunc()
1165 host->last_cmd = command; in brcmnand_cmdfunc()
1166 host->last_byte = 0; in brcmnand_cmdfunc()
1167 host->last_addr = addr; in brcmnand_cmdfunc()
1191 brcmnand_low_level_op(host, LL_OP_CMD, command, false); in brcmnand_cmdfunc()
1192 brcmnand_low_level_op(host, LL_OP_ADDR, column, false); in brcmnand_cmdfunc()
1201 if (brcmnand_get_sector_size_1k(host)) { in brcmnand_cmdfunc()
1202 host->hwcfg.sector_size_1k = in brcmnand_cmdfunc()
1203 brcmnand_get_sector_size_1k(host); in brcmnand_cmdfunc()
1204 brcmnand_set_sector_size_1k(host, 0); in brcmnand_cmdfunc()
1213 (host->cs << 16) | ((addr >> 32) & 0xffff)); in brcmnand_cmdfunc()
1218 brcmnand_send_cmd(host, native_cmd); in brcmnand_cmdfunc()
1237 if (host->hwcfg.sector_size_1k) in brcmnand_cmdfunc()
1238 brcmnand_set_sector_size_1k(host, in brcmnand_cmdfunc()
1239 host->hwcfg.sector_size_1k); in brcmnand_cmdfunc()
1250 struct brcmnand_host *host = chip->priv; in brcmnand_read_byte() local
1251 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_read_byte()
1255 switch (host->last_cmd) { in brcmnand_read_byte()
1257 if (host->last_byte < 4) in brcmnand_read_byte()
1259 (24 - (host->last_byte << 3)); in brcmnand_read_byte()
1260 else if (host->last_byte < 8) in brcmnand_read_byte()
1262 (56 - (host->last_byte << 3)); in brcmnand_read_byte()
1266 ret = oob_reg_read(ctrl, host->last_byte); in brcmnand_read_byte()
1278 addr = host->last_addr + host->last_byte; in brcmnand_read_byte()
1282 if (host->last_byte > 0 && offs == 0) in brcmnand_read_byte()
1289 if (host->last_byte >= ONFI_SUBFEATURE_PARAM_LEN) { in brcmnand_read_byte()
1292 bool last = host->last_byte == in brcmnand_read_byte()
1294 brcmnand_low_level_op(host, LL_OP_RD, 0, last); in brcmnand_read_byte()
1300 host->last_byte++; in brcmnand_read_byte()
1318 struct brcmnand_host *host = chip->priv; in brcmnand_write_buf() local
1320 switch (host->last_cmd) { in brcmnand_write_buf()
1323 brcmnand_low_level_op(host, LL_OP_WR, buf[i], in brcmnand_write_buf()
1338 static int brcmnand_fill_dma_desc(struct brcmnand_host *host, in brcmnand_fill_dma_desc() argument
1360 desc->cs = host->cs; in brcmnand_fill_dma_desc()
1368 static void brcmnand_dma_run(struct brcmnand_host *host, dma_addr_t desc) in brcmnand_dma_run() argument
1370 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_dma_run()
1393 static int brcmnand_dma_trans(struct brcmnand_host *host, u64 addr, u32 *buf, in brcmnand_dma_trans() argument
1396 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_dma_trans()
1406 brcmnand_fill_dma_desc(host, ctrl->dma_desc, addr, buf_pa, len, in brcmnand_dma_trans()
1409 brcmnand_dma_run(host, ctrl->dma_pa); in brcmnand_dma_trans()
1428 struct brcmnand_host *host = chip->priv; in brcmnand_read_by_pio() local
1429 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_read_by_pio()
1437 (host->cs << 16) | ((addr >> 32) & 0xffff)); in brcmnand_read_by_pio()
1445 brcmnand_send_cmd(host, CMD_PAGE_READ); in brcmnand_read_by_pio()
1460 host->hwcfg.sector_size_1k); in brcmnand_read_by_pio()
1489 struct brcmnand_host *host = chip->priv; in brcmnand_read() local
1490 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_read()
1499 err = brcmnand_dma_trans(host, addr, buf, trans * FC_BYTES, in brcmnand_read()
1539 struct brcmnand_host *host = chip->priv; in brcmnand_read_page() local
1542 return brcmnand_read(mtd, chip, host->last_addr, in brcmnand_read_page()
1549 struct brcmnand_host *host = chip->priv; in brcmnand_read_page_raw() local
1553 brcmnand_set_ecc_enabled(host, 0); in brcmnand_read_page_raw()
1554 ret = brcmnand_read(mtd, chip, host->last_addr, in brcmnand_read_page_raw()
1556 brcmnand_set_ecc_enabled(host, 1); in brcmnand_read_page_raw()
1571 struct brcmnand_host *host = chip->priv; in brcmnand_read_oob_raw() local
1573 brcmnand_set_ecc_enabled(host, 0); in brcmnand_read_oob_raw()
1577 brcmnand_set_ecc_enabled(host, 1); in brcmnand_read_oob_raw()
1585 struct brcmnand_host *host = chip->priv; in brcmnand_read_subpage() local
1587 return brcmnand_read(mtd, chip, host->last_addr + data_offs, in brcmnand_read_subpage()
1594 struct brcmnand_host *host = chip->priv; in brcmnand_write() local
1595 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_write()
1612 if (brcmnand_dma_trans(host, addr, (u32 *)buf, in brcmnand_write()
1619 (host->cs << 16) | ((addr >> 32) & 0xffff)); in brcmnand_write()
1643 host->hwcfg.sector_size_1k); in brcmnand_write()
1647 brcmnand_send_cmd(host, CMD_PROGRAM_PAGE); in brcmnand_write()
1665 struct brcmnand_host *host = chip->priv; in brcmnand_write_page() local
1668 brcmnand_write(mtd, chip, host->last_addr, (const u32 *)buf, oob); in brcmnand_write_page()
1676 struct brcmnand_host *host = chip->priv; in brcmnand_write_page_raw() local
1679 brcmnand_set_ecc_enabled(host, 0); in brcmnand_write_page_raw()
1680 brcmnand_write(mtd, chip, host->last_addr, (const u32 *)buf, oob); in brcmnand_write_page_raw()
1681 brcmnand_set_ecc_enabled(host, 1); in brcmnand_write_page_raw()
1695 struct brcmnand_host *host = chip->priv; in brcmnand_write_oob_raw() local
1698 brcmnand_set_ecc_enabled(host, 0); in brcmnand_write_oob_raw()
1701 brcmnand_set_ecc_enabled(host, 1); in brcmnand_write_oob_raw()
1710 static int brcmnand_set_cfg(struct brcmnand_host *host, in brcmnand_set_cfg() argument
1713 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_set_cfg()
1714 struct nand_chip *chip = &host->chip; in brcmnand_set_cfg()
1715 u16 cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG); in brcmnand_set_cfg()
1716 u16 cfg_ext_offs = brcmnand_cs_offset(ctrl, host->cs, in brcmnand_set_cfg()
1718 u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs, in brcmnand_set_cfg()
1800 brcmnand_set_sector_size_1k(host, cfg->sector_size_1k); in brcmnand_set_cfg()
1803 brcmnand_wr_corr_thresh(host, DIV_ROUND_UP(chip->ecc.strength * 3, 4)); in brcmnand_set_cfg()
1839 static int brcmnand_setup_dev(struct brcmnand_host *host) in brcmnand_setup_dev() argument
1841 struct mtd_info *mtd = &host->mtd; in brcmnand_setup_dev()
1842 struct nand_chip *chip = &host->chip; in brcmnand_setup_dev()
1843 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_setup_dev()
1844 struct brcmnand_cfg *cfg = &host->hwcfg; in brcmnand_setup_dev()
1910 ret = brcmnand_set_cfg(host, cfg); in brcmnand_setup_dev()
1914 brcmnand_set_ecc_enabled(host, 1); in brcmnand_setup_dev()
1920 offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_ACC_CONTROL); in brcmnand_setup_dev()
1940 static int brcmnand_init_cs(struct brcmnand_host *host) in brcmnand_init_cs() argument
1942 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_init_cs()
1943 struct device_node *dn = host->of_node; in brcmnand_init_cs()
1944 struct platform_device *pdev = host->pdev; in brcmnand_init_cs()
1951 ret = of_property_read_u32(dn, "reg", &host->cs); in brcmnand_init_cs()
1957 mtd = &host->mtd; in brcmnand_init_cs()
1958 chip = &host->chip; in brcmnand_init_cs()
1961 chip->priv = host; in brcmnand_init_cs()
1964 host->cs); in brcmnand_init_cs()
1996 cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG); in brcmnand_init_cs()
2014 if (brcmnand_setup_dev(host)) in brcmnand_init_cs()
2017 chip->ecc.size = host->hwcfg.sector_size_1k ? 1024 : 512; in brcmnand_init_cs()
2021 chip->ecc.layout = brcmstb_choose_ecc_layout(host); in brcmnand_init_cs()
2031 static void brcmnand_save_restore_cs_config(struct brcmnand_host *host, in brcmnand_save_restore_cs_config() argument
2034 struct brcmnand_controller *ctrl = host->ctrl; in brcmnand_save_restore_cs_config()
2035 u16 cfg_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_CFG); in brcmnand_save_restore_cs_config()
2036 u16 cfg_ext_offs = brcmnand_cs_offset(ctrl, host->cs, in brcmnand_save_restore_cs_config()
2038 u16 acc_control_offs = brcmnand_cs_offset(ctrl, host->cs, in brcmnand_save_restore_cs_config()
2040 u16 t1_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_TIMING1); in brcmnand_save_restore_cs_config()
2041 u16 t2_offs = brcmnand_cs_offset(ctrl, host->cs, BRCMNAND_CS_TIMING2); in brcmnand_save_restore_cs_config()
2044 nand_writereg(ctrl, cfg_offs, host->hwcfg.config); in brcmnand_save_restore_cs_config()
2047 host->hwcfg.config_ext); in brcmnand_save_restore_cs_config()
2048 nand_writereg(ctrl, acc_control_offs, host->hwcfg.acc_control); in brcmnand_save_restore_cs_config()
2049 nand_writereg(ctrl, t1_offs, host->hwcfg.timing_1); in brcmnand_save_restore_cs_config()
2050 nand_writereg(ctrl, t2_offs, host->hwcfg.timing_2); in brcmnand_save_restore_cs_config()
2052 host->hwcfg.config = nand_readreg(ctrl, cfg_offs); in brcmnand_save_restore_cs_config()
2054 host->hwcfg.config_ext = in brcmnand_save_restore_cs_config()
2056 host->hwcfg.acc_control = nand_readreg(ctrl, acc_control_offs); in brcmnand_save_restore_cs_config()
2057 host->hwcfg.timing_1 = nand_readreg(ctrl, t1_offs); in brcmnand_save_restore_cs_config()
2058 host->hwcfg.timing_2 = nand_readreg(ctrl, t2_offs); in brcmnand_save_restore_cs_config()
2065 struct brcmnand_host *host; in brcmnand_suspend() local
2067 list_for_each_entry(host, &ctrl->host_list, node) in brcmnand_suspend()
2068 brcmnand_save_restore_cs_config(host, 0); in brcmnand_suspend()
2084 struct brcmnand_host *host; in brcmnand_resume() local
2101 list_for_each_entry(host, &ctrl->host_list, node) { in brcmnand_resume()
2102 struct mtd_info *mtd = &host->mtd; in brcmnand_resume()
2105 brcmnand_save_restore_cs_config(host, 1); in brcmnand_resume()
2270 struct brcmnand_host *host; in brcmnand_probe() local
2272 host = devm_kzalloc(dev, sizeof(*host), GFP_KERNEL); in brcmnand_probe()
2273 if (!host) in brcmnand_probe()
2275 host->pdev = pdev; in brcmnand_probe()
2276 host->ctrl = ctrl; in brcmnand_probe()
2277 host->of_node = child; in brcmnand_probe()
2279 ret = brcmnand_init_cs(host); in brcmnand_probe()
2283 list_add_tail(&host->node, &ctrl->host_list); in brcmnand_probe()
2298 struct brcmnand_host *host; in brcmnand_remove() local
2300 list_for_each_entry(host, &ctrl->host_list, node) in brcmnand_remove()
2301 nand_release(&host->mtd); in brcmnand_remove()