memory: tegra20-emc: Add the SoC model prefix to functions
Replace "tegra_emc" with "tegra20_emc" in all functions to: 1. Avoid name clashing with other Tegra EMC drivers which makes it easier to jump to function definitions, 2. Decode the calltraces a bit easier, 3. Unify with other Tegra MC and EMC drivers, which use the SoC model prefixes. No functional impact. Reviewed-by: Jon Hunter <jonathanh@nvidia.com> Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
This commit is contained in:
@@ -232,7 +232,7 @@ struct tegra_emc {
|
|||||||
bool mrr_error;
|
bool mrr_error;
|
||||||
};
|
};
|
||||||
|
|
||||||
static irqreturn_t tegra_emc_isr(int irq, void *data)
|
static irqreturn_t tegra20_emc_isr(int irq, void *data)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = data;
|
struct tegra_emc *emc = data;
|
||||||
u32 intmask = EMC_REFRESH_OVERFLOW_INT;
|
u32 intmask = EMC_REFRESH_OVERFLOW_INT;
|
||||||
@@ -253,8 +253,8 @@ static irqreturn_t tegra_emc_isr(int irq, void *data)
|
|||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct emc_timing *tegra_emc_find_timing(struct tegra_emc *emc,
|
static struct emc_timing *tegra20_emc_find_timing(struct tegra_emc *emc,
|
||||||
unsigned long rate)
|
unsigned long rate)
|
||||||
{
|
{
|
||||||
struct emc_timing *timing = NULL;
|
struct emc_timing *timing = NULL;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@@ -276,7 +276,7 @@ static struct emc_timing *tegra_emc_find_timing(struct tegra_emc *emc,
|
|||||||
|
|
||||||
static int emc_prepare_timing_change(struct tegra_emc *emc, unsigned long rate)
|
static int emc_prepare_timing_change(struct tegra_emc *emc, unsigned long rate)
|
||||||
{
|
{
|
||||||
struct emc_timing *timing = tegra_emc_find_timing(emc, rate);
|
struct emc_timing *timing = tegra20_emc_find_timing(emc, rate);
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
if (!timing)
|
if (!timing)
|
||||||
@@ -321,8 +321,8 @@ static int emc_complete_timing_change(struct tegra_emc *emc, bool flush)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_clk_change_notify(struct notifier_block *nb,
|
static int tegra20_emc_clk_change_notify(struct notifier_block *nb,
|
||||||
unsigned long msg, void *data)
|
unsigned long msg, void *data)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = container_of(nb, struct tegra_emc, clk_nb);
|
struct tegra_emc *emc = container_of(nb, struct tegra_emc, clk_nb);
|
||||||
struct clk_notifier_data *cnd = data;
|
struct clk_notifier_data *cnd = data;
|
||||||
@@ -407,8 +407,8 @@ static int cmp_timings(const void *_a, const void *_b)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_load_timings_from_dt(struct tegra_emc *emc,
|
static int tegra20_emc_load_timings_from_dt(struct tegra_emc *emc,
|
||||||
struct device_node *node)
|
struct device_node *node)
|
||||||
{
|
{
|
||||||
struct emc_timing *timing;
|
struct emc_timing *timing;
|
||||||
int child_count;
|
int child_count;
|
||||||
@@ -452,7 +452,7 @@ static int tegra_emc_load_timings_from_dt(struct tegra_emc *emc,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct device_node *
|
static struct device_node *
|
||||||
tegra_emc_find_node_by_ram_code(struct tegra_emc *emc)
|
tegra20_emc_find_node_by_ram_code(struct tegra_emc *emc)
|
||||||
{
|
{
|
||||||
struct device *dev = emc->dev;
|
struct device *dev = emc->dev;
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
@@ -710,7 +710,7 @@ static long emc_round_rate(unsigned long rate,
|
|||||||
return timing->rate;
|
return timing->rate;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tegra_emc_rate_requests_init(struct tegra_emc *emc)
|
static void tegra20_emc_rate_requests_init(struct tegra_emc *emc)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -812,7 +812,7 @@ static int emc_set_max_rate(struct tegra_emc *emc, unsigned long rate,
|
|||||||
* valid range.
|
* valid range.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static bool tegra_emc_validate_rate(struct tegra_emc *emc, unsigned long rate)
|
static bool tegra20_emc_validate_rate(struct tegra_emc *emc, unsigned long rate)
|
||||||
{
|
{
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
|
|
||||||
@@ -823,7 +823,7 @@ static bool tegra_emc_validate_rate(struct tegra_emc *emc, unsigned long rate)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_debug_available_rates_show(struct seq_file *s, void *data)
|
static int tegra20_emc_debug_available_rates_show(struct seq_file *s, void *data)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = s->private;
|
struct tegra_emc *emc = s->private;
|
||||||
const char *prefix = "";
|
const char *prefix = "";
|
||||||
@@ -838,9 +838,9 @@ static int tegra_emc_debug_available_rates_show(struct seq_file *s, void *data)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
DEFINE_SHOW_ATTRIBUTE(tegra_emc_debug_available_rates);
|
DEFINE_SHOW_ATTRIBUTE(tegra20_emc_debug_available_rates);
|
||||||
|
|
||||||
static int tegra_emc_debug_min_rate_get(void *data, u64 *rate)
|
static int tegra20_emc_debug_min_rate_get(void *data, u64 *rate)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = data;
|
struct tegra_emc *emc = data;
|
||||||
|
|
||||||
@@ -849,12 +849,12 @@ static int tegra_emc_debug_min_rate_get(void *data, u64 *rate)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_debug_min_rate_set(void *data, u64 rate)
|
static int tegra20_emc_debug_min_rate_set(void *data, u64 rate)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = data;
|
struct tegra_emc *emc = data;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!tegra_emc_validate_rate(emc, rate))
|
if (!tegra20_emc_validate_rate(emc, rate))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = emc_set_min_rate(emc, rate, EMC_RATE_DEBUG);
|
err = emc_set_min_rate(emc, rate, EMC_RATE_DEBUG);
|
||||||
@@ -866,11 +866,11 @@ static int tegra_emc_debug_min_rate_set(void *data, u64 rate)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SIMPLE_ATTRIBUTE(tegra_emc_debug_min_rate_fops,
|
DEFINE_SIMPLE_ATTRIBUTE(tegra20_emc_debug_min_rate_fops,
|
||||||
tegra_emc_debug_min_rate_get,
|
tegra20_emc_debug_min_rate_get,
|
||||||
tegra_emc_debug_min_rate_set, "%llu\n");
|
tegra20_emc_debug_min_rate_set, "%llu\n");
|
||||||
|
|
||||||
static int tegra_emc_debug_max_rate_get(void *data, u64 *rate)
|
static int tegra20_emc_debug_max_rate_get(void *data, u64 *rate)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = data;
|
struct tegra_emc *emc = data;
|
||||||
|
|
||||||
@@ -879,12 +879,12 @@ static int tegra_emc_debug_max_rate_get(void *data, u64 *rate)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_debug_max_rate_set(void *data, u64 rate)
|
static int tegra20_emc_debug_max_rate_set(void *data, u64 rate)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = data;
|
struct tegra_emc *emc = data;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
if (!tegra_emc_validate_rate(emc, rate))
|
if (!tegra20_emc_validate_rate(emc, rate))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
err = emc_set_max_rate(emc, rate, EMC_RATE_DEBUG);
|
err = emc_set_max_rate(emc, rate, EMC_RATE_DEBUG);
|
||||||
@@ -896,11 +896,11 @@ static int tegra_emc_debug_max_rate_set(void *data, u64 rate)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
DEFINE_SIMPLE_ATTRIBUTE(tegra_emc_debug_max_rate_fops,
|
DEFINE_SIMPLE_ATTRIBUTE(tegra20_emc_debug_max_rate_fops,
|
||||||
tegra_emc_debug_max_rate_get,
|
tegra20_emc_debug_max_rate_get,
|
||||||
tegra_emc_debug_max_rate_set, "%llu\n");
|
tegra20_emc_debug_max_rate_set, "%llu\n");
|
||||||
|
|
||||||
static void tegra_emc_debugfs_init(struct tegra_emc *emc)
|
static void tegra20_emc_debugfs_init(struct tegra_emc *emc)
|
||||||
{
|
{
|
||||||
struct device *dev = emc->dev;
|
struct device *dev = emc->dev;
|
||||||
unsigned int i;
|
unsigned int i;
|
||||||
@@ -933,11 +933,11 @@ static void tegra_emc_debugfs_init(struct tegra_emc *emc)
|
|||||||
emc->debugfs.root = debugfs_create_dir("emc", NULL);
|
emc->debugfs.root = debugfs_create_dir("emc", NULL);
|
||||||
|
|
||||||
debugfs_create_file("available_rates", 0444, emc->debugfs.root,
|
debugfs_create_file("available_rates", 0444, emc->debugfs.root,
|
||||||
emc, &tegra_emc_debug_available_rates_fops);
|
emc, &tegra20_emc_debug_available_rates_fops);
|
||||||
debugfs_create_file("min_rate", 0644, emc->debugfs.root,
|
debugfs_create_file("min_rate", 0644, emc->debugfs.root,
|
||||||
emc, &tegra_emc_debug_min_rate_fops);
|
emc, &tegra20_emc_debug_min_rate_fops);
|
||||||
debugfs_create_file("max_rate", 0644, emc->debugfs.root,
|
debugfs_create_file("max_rate", 0644, emc->debugfs.root,
|
||||||
emc, &tegra_emc_debug_max_rate_fops);
|
emc, &tegra20_emc_debug_max_rate_fops);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline struct tegra_emc *
|
static inline struct tegra_emc *
|
||||||
@@ -1000,7 +1000,7 @@ static int emc_icc_set(struct icc_node *src, struct icc_node *dst)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_interconnect_init(struct tegra_emc *emc)
|
static int tegra20_emc_interconnect_init(struct tegra_emc *emc)
|
||||||
{
|
{
|
||||||
const struct tegra_mc_soc *soc;
|
const struct tegra_mc_soc *soc;
|
||||||
struct icc_node *node;
|
struct icc_node *node;
|
||||||
@@ -1055,25 +1055,25 @@ remove_nodes:
|
|||||||
return dev_err_probe(emc->dev, err, "failed to initialize ICC\n");
|
return dev_err_probe(emc->dev, err, "failed to initialize ICC\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
static void devm_tegra_emc_unset_callback(void *data)
|
static void devm_tegra20_emc_unset_callback(void *data)
|
||||||
{
|
{
|
||||||
tegra20_clk_set_emc_round_callback(NULL, NULL);
|
tegra20_clk_set_emc_round_callback(NULL, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void devm_tegra_emc_unreg_clk_notifier(void *data)
|
static void devm_tegra20_emc_unreg_clk_notifier(void *data)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = data;
|
struct tegra_emc *emc = data;
|
||||||
|
|
||||||
clk_notifier_unregister(emc->clk, &emc->clk_nb);
|
clk_notifier_unregister(emc->clk, &emc->clk_nb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_init_clk(struct tegra_emc *emc)
|
static int tegra20_emc_init_clk(struct tegra_emc *emc)
|
||||||
{
|
{
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
tegra20_clk_set_emc_round_callback(emc_round_rate, emc);
|
tegra20_clk_set_emc_round_callback(emc_round_rate, emc);
|
||||||
|
|
||||||
err = devm_add_action_or_reset(emc->dev, devm_tegra_emc_unset_callback,
|
err = devm_add_action_or_reset(emc->dev, devm_tegra20_emc_unset_callback,
|
||||||
NULL);
|
NULL);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
@@ -1088,15 +1088,15 @@ static int tegra_emc_init_clk(struct tegra_emc *emc)
|
|||||||
return dev_err_probe(emc->dev, err, "failed to register clk notifier\n");
|
return dev_err_probe(emc->dev, err, "failed to register clk notifier\n");
|
||||||
|
|
||||||
err = devm_add_action_or_reset(emc->dev,
|
err = devm_add_action_or_reset(emc->dev,
|
||||||
devm_tegra_emc_unreg_clk_notifier, emc);
|
devm_tegra20_emc_unreg_clk_notifier, emc);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_devfreq_target(struct device *dev, unsigned long *freq,
|
static int tegra20_emc_devfreq_target(struct device *dev, unsigned long *freq,
|
||||||
u32 flags)
|
u32 flags)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = dev_get_drvdata(dev);
|
struct tegra_emc *emc = dev_get_drvdata(dev);
|
||||||
struct dev_pm_opp *opp;
|
struct dev_pm_opp *opp;
|
||||||
@@ -1114,8 +1114,8 @@ static int tegra_emc_devfreq_target(struct device *dev, unsigned long *freq,
|
|||||||
return emc_set_min_rate(emc, rate, EMC_RATE_DEVFREQ);
|
return emc_set_min_rate(emc, rate, EMC_RATE_DEVFREQ);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_devfreq_get_dev_status(struct device *dev,
|
static int tegra20_emc_devfreq_get_dev_status(struct device *dev,
|
||||||
struct devfreq_dev_status *stat)
|
struct devfreq_dev_status *stat)
|
||||||
{
|
{
|
||||||
struct tegra_emc *emc = dev_get_drvdata(dev);
|
struct tegra_emc *emc = dev_get_drvdata(dev);
|
||||||
|
|
||||||
@@ -1137,13 +1137,13 @@ static int tegra_emc_devfreq_get_dev_status(struct device *dev,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct devfreq_dev_profile tegra_emc_devfreq_profile = {
|
static struct devfreq_dev_profile tegra20_emc_devfreq_profile = {
|
||||||
.polling_ms = 30,
|
.polling_ms = 30,
|
||||||
.target = tegra_emc_devfreq_target,
|
.target = tegra20_emc_devfreq_target,
|
||||||
.get_dev_status = tegra_emc_devfreq_get_dev_status,
|
.get_dev_status = tegra20_emc_devfreq_get_dev_status,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int tegra_emc_devfreq_init(struct tegra_emc *emc)
|
static int tegra20_emc_devfreq_init(struct tegra_emc *emc)
|
||||||
{
|
{
|
||||||
struct devfreq *devfreq;
|
struct devfreq *devfreq;
|
||||||
|
|
||||||
@@ -1165,7 +1165,7 @@ static int tegra_emc_devfreq_init(struct tegra_emc *emc)
|
|||||||
writel_relaxed(0x00000000, emc->regs + EMC_STAT_LLMC_CONTROL);
|
writel_relaxed(0x00000000, emc->regs + EMC_STAT_LLMC_CONTROL);
|
||||||
writel_relaxed(0xffffffff, emc->regs + EMC_STAT_PWR_CLOCK_LIMIT);
|
writel_relaxed(0xffffffff, emc->regs + EMC_STAT_PWR_CLOCK_LIMIT);
|
||||||
|
|
||||||
devfreq = devm_devfreq_add_device(emc->dev, &tegra_emc_devfreq_profile,
|
devfreq = devm_devfreq_add_device(emc->dev, &tegra20_emc_devfreq_profile,
|
||||||
DEVFREQ_GOV_SIMPLE_ONDEMAND,
|
DEVFREQ_GOV_SIMPLE_ONDEMAND,
|
||||||
&emc->ondemand_data);
|
&emc->ondemand_data);
|
||||||
if (IS_ERR(devfreq))
|
if (IS_ERR(devfreq))
|
||||||
@@ -1175,7 +1175,7 @@ static int tegra_emc_devfreq_init(struct tegra_emc *emc)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tegra_emc_probe(struct platform_device *pdev)
|
static int tegra20_emc_probe(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct tegra_core_opp_params opp_params = {};
|
struct tegra_core_opp_params opp_params = {};
|
||||||
struct device_node *np;
|
struct device_node *np;
|
||||||
@@ -1191,7 +1191,7 @@ static int tegra_emc_probe(struct platform_device *pdev)
|
|||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
mutex_init(&emc->rate_lock);
|
mutex_init(&emc->rate_lock);
|
||||||
emc->clk_nb.notifier_call = tegra_emc_clk_change_notify;
|
emc->clk_nb.notifier_call = tegra20_emc_clk_change_notify;
|
||||||
emc->dev = &pdev->dev;
|
emc->dev = &pdev->dev;
|
||||||
|
|
||||||
emc->regs = devm_platform_ioremap_resource(pdev, 0);
|
emc->regs = devm_platform_ioremap_resource(pdev, 0);
|
||||||
@@ -1202,22 +1202,22 @@ static int tegra_emc_probe(struct platform_device *pdev)
|
|||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
np = tegra_emc_find_node_by_ram_code(emc);
|
np = tegra20_emc_find_node_by_ram_code(emc);
|
||||||
if (np) {
|
if (np) {
|
||||||
err = tegra_emc_load_timings_from_dt(emc, np);
|
err = tegra20_emc_load_timings_from_dt(emc, np);
|
||||||
of_node_put(np);
|
of_node_put(np);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = devm_request_irq(&pdev->dev, irq, tegra_emc_isr, 0,
|
err = devm_request_irq(&pdev->dev, irq, tegra20_emc_isr, 0,
|
||||||
dev_name(&pdev->dev), emc);
|
dev_name(&pdev->dev), emc);
|
||||||
if (err) {
|
if (err) {
|
||||||
dev_err(&pdev->dev, "failed to request IRQ: %d\n", err);
|
dev_err(&pdev->dev, "failed to request IRQ: %d\n", err);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = tegra_emc_init_clk(emc);
|
err = tegra20_emc_init_clk(emc);
|
||||||
if (err)
|
if (err)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
@@ -1228,10 +1228,10 @@ static int tegra_emc_probe(struct platform_device *pdev)
|
|||||||
return err;
|
return err;
|
||||||
|
|
||||||
platform_set_drvdata(pdev, emc);
|
platform_set_drvdata(pdev, emc);
|
||||||
tegra_emc_rate_requests_init(emc);
|
tegra20_emc_rate_requests_init(emc);
|
||||||
tegra_emc_debugfs_init(emc);
|
tegra20_emc_debugfs_init(emc);
|
||||||
tegra_emc_interconnect_init(emc);
|
tegra20_emc_interconnect_init(emc);
|
||||||
tegra_emc_devfreq_init(emc);
|
tegra20_emc_devfreq_init(emc);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Don't allow the kernel module to be unloaded. Unloading adds some
|
* Don't allow the kernel module to be unloaded. Unloading adds some
|
||||||
@@ -1243,22 +1243,22 @@ static int tegra_emc_probe(struct platform_device *pdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct of_device_id tegra_emc_of_match[] = {
|
static const struct of_device_id tegra20_emc_of_match[] = {
|
||||||
{ .compatible = "nvidia,tegra20-emc", },
|
{ .compatible = "nvidia,tegra20-emc", },
|
||||||
{},
|
{},
|
||||||
};
|
};
|
||||||
MODULE_DEVICE_TABLE(of, tegra_emc_of_match);
|
MODULE_DEVICE_TABLE(of, tegra20_emc_of_match);
|
||||||
|
|
||||||
static struct platform_driver tegra_emc_driver = {
|
static struct platform_driver tegra20_emc_driver = {
|
||||||
.probe = tegra_emc_probe,
|
.probe = tegra20_emc_probe,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = "tegra20-emc",
|
.name = "tegra20-emc",
|
||||||
.of_match_table = tegra_emc_of_match,
|
.of_match_table = tegra20_emc_of_match,
|
||||||
.suppress_bind_attrs = true,
|
.suppress_bind_attrs = true,
|
||||||
.sync_state = icc_sync_state,
|
.sync_state = icc_sync_state,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
module_platform_driver(tegra_emc_driver);
|
module_platform_driver(tegra20_emc_driver);
|
||||||
|
|
||||||
MODULE_AUTHOR("Dmitry Osipenko <digetx@gmail.com>");
|
MODULE_AUTHOR("Dmitry Osipenko <digetx@gmail.com>");
|
||||||
MODULE_DESCRIPTION("NVIDIA Tegra20 EMC driver");
|
MODULE_DESCRIPTION("NVIDIA Tegra20 EMC driver");
|
||||||
|
|||||||
Reference in New Issue
Block a user