Lines Matching refs:chip
44 static int get_chip(struct map_info *map, struct flchip *chip, int mode);
45 static int chip_ready(struct map_info *map, struct flchip *chip, int mode);
46 static void put_chip(struct map_info *map, struct flchip *chip);
52 struct flchip *chip; in lpddr_cmdset() local
89 chip = &lpddr->chips[0]; in lpddr_cmdset()
95 *chip = lpddr->chips[i]; in lpddr_cmdset()
96 chip->start += j << lpddr->chipshift; in lpddr_cmdset()
97 chip->oldstate = chip->state = FL_READY; in lpddr_cmdset()
98 chip->priv = &shared[i]; in lpddr_cmdset()
101 init_waitqueue_head(&chip->wq); in lpddr_cmdset()
102 mutex_init(&chip->mutex); in lpddr_cmdset()
103 chip++; in lpddr_cmdset()
111 static int wait_for_ready(struct map_info *map, struct flchip *chip, in wait_for_ready() argument
116 flstate_t chip_state = chip->state; in wait_for_ready()
138 mutex_unlock(&chip->mutex); in wait_for_ready()
153 mutex_lock(&chip->mutex); in wait_for_ready()
155 while (chip->state != chip_state) { in wait_for_ready()
159 add_wait_queue(&chip->wq, &wait); in wait_for_ready()
160 mutex_unlock(&chip->mutex); in wait_for_ready()
162 remove_wait_queue(&chip->wq, &wait); in wait_for_ready()
163 mutex_lock(&chip->mutex); in wait_for_ready()
165 if (chip->erase_suspended || chip->write_suspended) { in wait_for_ready()
168 chip->erase_suspended = chip->write_suspended = 0; in wait_for_ready()
180 chip->state = FL_READY; in wait_for_ready()
184 static int get_chip(struct map_info *map, struct flchip *chip, int mode) in get_chip() argument
190 if (chip->priv && (mode == FL_WRITING || mode == FL_ERASING) in get_chip()
191 && chip->state != FL_SYNCING) { in get_chip()
210 struct flchip_shared *shared = chip->priv; in get_chip()
214 if (contender && contender != chip) { in get_chip()
228 mutex_unlock(&chip->mutex); in get_chip()
230 mutex_lock(&chip->mutex); in get_chip()
244 if (chip->state == FL_SYNCING) { in get_chip()
258 add_wait_queue(&chip->wq, &wait); in get_chip()
259 mutex_unlock(&chip->mutex); in get_chip()
261 remove_wait_queue(&chip->wq, &wait); in get_chip()
262 mutex_lock(&chip->mutex); in get_chip()
267 shared->writing = chip; in get_chip()
269 shared->erasing = chip; in get_chip()
273 ret = chip_ready(map, chip, mode); in get_chip()
280 static int chip_ready(struct map_info *map, struct flchip *chip, int mode) in chip_ready() argument
287 if (FL_SYNCING == mode && FL_READY != chip->oldstate) in chip_ready()
290 switch (chip->state) { in chip_ready()
302 chip->oldstate = FL_ERASING; in chip_ready()
303 chip->state = FL_ERASE_SUSPENDING; in chip_ready()
304 ret = wait_for_ready(map, chip, 0); in chip_ready()
308 put_chip(map, chip); in chip_ready()
313 chip->erase_suspended = 1; in chip_ready()
314 chip->state = FL_READY; in chip_ready()
319 if (mode == FL_READY && chip->oldstate == FL_READY) in chip_ready()
325 add_wait_queue(&chip->wq, &wait); in chip_ready()
326 mutex_unlock(&chip->mutex); in chip_ready()
328 remove_wait_queue(&chip->wq, &wait); in chip_ready()
329 mutex_lock(&chip->mutex); in chip_ready()
334 static void put_chip(struct map_info *map, struct flchip *chip) in put_chip() argument
336 if (chip->priv) { in put_chip()
337 struct flchip_shared *shared = chip->priv; in put_chip()
339 if (shared->writing == chip && chip->oldstate == FL_READY) { in put_chip()
342 if (shared->writing && shared->writing != chip) { in put_chip()
347 mutex_unlock(&chip->mutex); in put_chip()
349 mutex_lock(&chip->mutex); in put_chip()
351 wake_up(&chip->wq); in put_chip()
356 } else if (shared->erasing == chip && shared->writing != chip) { in put_chip()
365 wake_up(&chip->wq); in put_chip()
371 switch (chip->oldstate) { in put_chip()
377 chip->oldstate = FL_READY; in put_chip()
378 chip->state = FL_ERASING; in put_chip()
384 map->name, chip->oldstate); in put_chip()
386 wake_up(&chip->wq); in put_chip()
389 static int do_write_buffer(struct map_info *map, struct flchip *chip, in do_write_buffer() argument
402 mutex_lock(&chip->mutex); in do_write_buffer()
403 ret = get_chip(map, chip, FL_WRITING); in do_write_buffer()
405 mutex_unlock(&chip->mutex); in do_write_buffer()
457 chip->state = FL_WRITING; in do_write_buffer()
458 ret = wait_for_ready(map, chip, (1<<lpddr->qinfo->ProgBufferTime)); in do_write_buffer()
465 out: put_chip(map, chip); in do_write_buffer()
466 mutex_unlock(&chip->mutex); in do_write_buffer()
475 struct flchip *chip = &lpddr->chips[chipnum]; in do_erase_oneblock() local
478 mutex_lock(&chip->mutex); in do_erase_oneblock()
479 ret = get_chip(map, chip, FL_ERASING); in do_erase_oneblock()
481 mutex_unlock(&chip->mutex); in do_erase_oneblock()
485 chip->state = FL_ERASING; in do_erase_oneblock()
486 ret = wait_for_ready(map, chip, (1<<lpddr->qinfo->BlockEraseTime)*1000); in do_erase_oneblock()
492 out: put_chip(map, chip); in do_erase_oneblock()
493 mutex_unlock(&chip->mutex); in do_erase_oneblock()
503 struct flchip *chip = &lpddr->chips[chipnum]; in lpddr_read() local
506 mutex_lock(&chip->mutex); in lpddr_read()
507 ret = get_chip(map, chip, FL_READY); in lpddr_read()
509 mutex_unlock(&chip->mutex); in lpddr_read()
516 put_chip(map, chip); in lpddr_read()
517 mutex_unlock(&chip->mutex); in lpddr_read()
528 struct flchip *chip = &lpddr->chips[chipnum]; in lpddr_point() local
536 *mtdbuf = (void *)map->virt + chip->start + ofs; in lpddr_point()
546 last_end = chip->start; in lpddr_point()
547 else if (chip->start != last_end) in lpddr_point()
555 mutex_lock(&chip->mutex); in lpddr_point()
556 ret = get_chip(map, chip, FL_POINT); in lpddr_point()
557 mutex_unlock(&chip->mutex); in lpddr_point()
561 chip->state = FL_POINT; in lpddr_point()
562 chip->ref_point_counter++; in lpddr_point()
569 chip = &lpddr->chips[chipnum]; in lpddr_point()
586 struct flchip *chip; in lpddr_unpoint() local
588 chip = &lpddr->chips[chipnum]; in lpddr_unpoint()
597 mutex_lock(&chip->mutex); in lpddr_unpoint()
598 if (chip->state == FL_POINT) { in lpddr_unpoint()
599 chip->ref_point_counter--; in lpddr_unpoint()
600 if (chip->ref_point_counter == 0) in lpddr_unpoint()
601 chip->state = FL_READY; in lpddr_unpoint()
608 put_chip(map, chip); in lpddr_unpoint()
609 mutex_unlock(&chip->mutex); in lpddr_unpoint()
710 struct flchip *chip = &lpddr->chips[chipnum]; in do_xxlock() local
712 mutex_lock(&chip->mutex); in do_xxlock()
713 ret = get_chip(map, chip, FL_LOCKING); in do_xxlock()
715 mutex_unlock(&chip->mutex); in do_xxlock()
721 chip->state = FL_LOCKING; in do_xxlock()
724 chip->state = FL_UNLOCKING; in do_xxlock()
728 ret = wait_for_ready(map, chip, 1); in do_xxlock()
734 out: put_chip(map, chip); in do_xxlock()
735 mutex_unlock(&chip->mutex); in do_xxlock()