1720c6343SVivien Didelot /* 2720c6343SVivien Didelot * Marvell 88E6xxx Address Translation Unit (ATU) support 3720c6343SVivien Didelot * 4720c6343SVivien Didelot * Copyright (c) 2008 Marvell Semiconductor 5720c6343SVivien Didelot * Copyright (c) 2017 Savoir-faire Linux, Inc. 6720c6343SVivien Didelot * 7720c6343SVivien Didelot * This program is free software; you can redistribute it and/or modify 8720c6343SVivien Didelot * it under the terms of the GNU General Public License as published by 9720c6343SVivien Didelot * the Free Software Foundation; either version 2 of the License, or 10720c6343SVivien Didelot * (at your option) any later version. 11720c6343SVivien Didelot */ 12720c6343SVivien Didelot 13720c6343SVivien Didelot #include "mv88e6xxx.h" 14720c6343SVivien Didelot #include "global1.h" 15720c6343SVivien Didelot 16720c6343SVivien Didelot /* Offset 0x0A: ATU Control Register */ 17720c6343SVivien Didelot 18720c6343SVivien Didelot int mv88e6xxx_g1_atu_set_age_time(struct mv88e6xxx_chip *chip, 19720c6343SVivien Didelot unsigned int msecs) 20720c6343SVivien Didelot { 21720c6343SVivien Didelot const unsigned int coeff = chip->info->age_time_coeff; 22720c6343SVivien Didelot const unsigned int min = 0x01 * coeff; 23720c6343SVivien Didelot const unsigned int max = 0xff * coeff; 24720c6343SVivien Didelot u8 age_time; 25720c6343SVivien Didelot u16 val; 26720c6343SVivien Didelot int err; 27720c6343SVivien Didelot 28720c6343SVivien Didelot if (msecs < min || msecs > max) 29720c6343SVivien Didelot return -ERANGE; 30720c6343SVivien Didelot 31720c6343SVivien Didelot /* Round to nearest multiple of coeff */ 32720c6343SVivien Didelot age_time = (msecs + coeff / 2) / coeff; 33720c6343SVivien Didelot 34720c6343SVivien Didelot err = mv88e6xxx_g1_read(chip, GLOBAL_ATU_CONTROL, &val); 35720c6343SVivien Didelot if (err) 36720c6343SVivien Didelot return err; 37720c6343SVivien Didelot 38720c6343SVivien Didelot /* AgeTime is 11:4 bits */ 39720c6343SVivien Didelot val &= ~0xff0; 40720c6343SVivien Didelot val |= age_time << 4; 41720c6343SVivien Didelot 42720c6343SVivien Didelot return mv88e6xxx_g1_write(chip, GLOBAL_ATU_CONTROL, val); 43720c6343SVivien Didelot } 44